假设我有一个列表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列表。
答案 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)