Mathematica 针对 Python 列表、元组和字典的 Nothing [重复]

问题描述 投票:0回答:3

Mathematica 有一个名为 Nothing 的对象,当放入列表中时它会自动消失。

例如,

{a, b, Nothing, c, d, Nothing}
自动计算为
{a, b, c, d}

Python 是否存在类似的东西?

我尝试了

x = (1, 2, 3, 4 if True, 5)
,它抱怨缺少 else 语句。移动到
x = (1, 2, 3, 4 if True else None, 5)
成功,但
y = (1, 2, 3, 4 if False else None, 5)
给出
(1, 2, 3, None, 5)
而我想要的是
(1, 2, 3, 5)
,所以
None
被保留,而
Nothing
将被删除。

如果有这样的事情,对

[lists,]
{'dict': 'ionaries'}
有用吗?

python tuples wolfram-mathematica
3个回答
5
投票

(4,) if True else ()
计算为元组
(4,)
或空元组
()
,因此将其解包后您可以编写
x = (1,2,3,*((4,) if True else ()),5)

几乎完全相同的事情适用于列表,

x = [1,2,3,*((4,) if True else ()),5]

解压字典也可以:

x = {'a':1, **({'b':2} if True else {})}


4
投票

我只会使用

None
,然后使用过滤器。

x = (1, 2, 3, None, 5)
x = tuple(filter(None, x))

如果你想要一句:

x = tuple(x for x in (1, 2, 3, None, 5) if x is not None)
# or
x = tuple(filter(None, (1, 2, 3, None, 5)))

如果你想要一个构造元组的函数,你可以使用:

def tup(*items):
    return tuple(filter(None, items))

x = tup(1,2,3,None,5)

0
投票

每种编程语言都有一套自己的基本概念和思想,即使其中许多概念和思想在大多数流行语言之间共享,但有些是特定于语言的。 Python 作为编程语言和编码哲学并不带有 Mathematica 意义上的

Nothing
的概念。

在 Python 中,

Nothing
的概念需要使用
None
来表达,或者在使用
float("nan")
处理浮点数时,它们本身就是特殊的 Python 对象,表示缺少有效值。

作为介绍,让我们提供一个Python构造,它类似于问题中提到的Mathematica意义上的

Nothing
的用法:

x = (1, 2, 3, *(), 5)

换句话说,在仅此特定用例中,与 Mathematica

Nothing
等效的 Python 是:

*()

在字典的背景下:

**{}

d = {'a':1, **{}, 'c':3 }

正如 deceze 的评论中所提到的,这个构造本身作为占位符的用途非常有限,用于将来的替换标记在列表中的位置。让我们举一些例子,其中使用这种构造确实更有意义:

x = [ 1, 2, *(3 if False else ()), 4 ]

d = {'a':1, **({'b':2} if False else {}) , 'c':3 }

False
替换为任何适用于用例的适当条件,以获得更有用的使用案例。

为了完整起见,让我们提到使用可用于 Python 列表的列表添加来实现相同/相似功能的另一种可能方法:

x = [ 1, 2 ] + [] + [ 4 ]
x = [ 1, 2 ] + [*([3] if False else ())] + [ 4 ]

此结构也可用于字典:

d = dict( [('a',1)] + [] + [('c',3)] )
d = dict( [('a',1)] + [*(('b',2) if False else ())] + [('c',3)] )

如果您出于某种奇怪的原因想避免在条件表达式中使用关键字

else
,您可以使用以下“技巧”:

x = [ 1, 2, *(_ for _ in [3] if False), 4]
d = dict( [('a',1)] + [*(_ for _ in [('b',2)] if False)] + [('c',3)] )

虽然可能有点“脏”,但可能更容易理解,并且更适合阅读者的眼睛,因为强调了 [3][('b',2)] 吸引了眼球,使得嵌入它的表达不那么突兀。


注意

*()
**{}
在Python中都不能像
Nothing
在Mathematica中一样工作。例如,您不能用
Nothing
替换列表元素以使其消失。例如,要从列表 x 中删除 3,您需要实际删除它:

x.pop(x.index(3)) 

换句话说,正如 deceze 在您问题的评论中已经正确提到的那样:

Mathematica

Nothing
似乎有非常具体的用例,这些用例与 Python 无关,因此 不存在等效项

© www.soinside.com 2019 - 2024. All rights reserved.