定义元组/列表时的条件

时间:2015-07-06 17:42:52

标签: python

假设我有一个列表x = ['a','b','c'],可以有条件地为此添加一个术语:

if conditional:
    x.append('d')

但我不能为元组(x = ('a','b','c')

执行此操作

对于这两种情况,定义中存在条件定位项的“干净”方式。伪代码:

X = (
    'a',
    'b',
    'c',
    'd' if Y,
    'e' if Z,
)

这个用例是一个Django INSTALLED_APPS元组和urlpatterns列表。

6 个答案:

答案 0 :(得分:4)

你可以将另一个元组连接到最后。

x = ('a','b','c')
if Y:
    x += ('d',)
if Z:
    x += ('e',)
print(x)

答案 1 :(得分:3)

一种方法 - 如果你要生成tuple的内容很有用 - 就是使用生成器:

def gen_X():
    yield 'a'
    yield 'b'
    yield 'c'
    if Y:
        yield 'd'
    if Z:
        yield 'e'

然后从生成器结果中生成tuple

X = tuple(gen_X())

稍加修改版本,您还可以提供确定生成器将生成什么的参数:

def gen_X(Y = True, Z = True):
    yield 'a'
    yield 'b'
    yield 'c'
    if Y:
        yield 'd'
    if Z:
        yield 'e'

使用生成器执行此操作的一个好处是,您不必在内存中保留多组元组 - 内容和逻辑都包含在生成器中。因此,您可以同时迭代相同数据的许多不同版本,但它们只包含在一个位置,并在您需要时即时生成。

答案 2 :(得分:1)

另一种方法是制作一个列表,然后通过调用tuple(lst)将列表转换为元组。

答案 3 :(得分:1)

Python不提供这种语法糖。 解决问题的最简单方法是使用列表。然后你可以使用my_list.append(),最后,当你需要一个元组时,从中创建一个元组:tuple(my_list)。 (INSTALLED_APPS = tuple(my_list)

答案 4 :(得分:0)

一种解决方案是连接元组。

x = ('a', 'b', 'c') + (('d',) if Y else ()) + (('e',) if Z else ())

这样做的一个好处是它是一个在lambda中可用的表达式。

答案 5 :(得分:0)

你可以使用生成器表达式执行类似的操作:

truth_table = {'a': True, 'b': True, 'c': True, 'd': Y, 'e': Z}
X = tuple(k for k,v in sorted(truth_table.items()) if v)

......或在一行中:

X = tuple(k for k,v in sorted({'a': True, 'b': True, 'c': True, 'd': Y, 'e': Z}.items()) if v)