【问题标题】:Unpack tuples in list comprehension with a condition使用条件解包列表理解中的元组
【发布时间】:2022-12-24 22:48:26
【问题描述】:

我想构建这些元组列表之一:

  • (a, 0), (-a, 0) (b, 0), (-b, 0)
  • (0, a), (0, -a) (0, b), (0, -b)

来自标量 ab

基于条件:

  • c = a > b

这是我的尝试:

a = 5
b = 2
c = a > b

# Try build two tuples per element, e.g. (5, 0), (-5, 0) (2, 0), (-2, 0)

# This syntax is illegal
#f2 = [(m,0), (-m,0) if c else (0,m), (-0,-m) for m in (a,b)]

# This syntax works but creates tuples of tuples
f2 = [tuple(((m,0), (-m,0))) if c else tuple(((0,m), (-0,-m))) for m in (a,b)]
print(*f2) # ((5, 0), (-5, 0)) ((2, 0), (-2, 0))

# This syntax is illegal
#f3 = [*tuple(((m,0), (-m,0))) if c else *tuple(((0,m), (-0,-m))) for m in (a,b)]
#print(*f3)

f2 构建两个元组的两个元组的列表:((5, 0), (-5, 0)) ((2, 0), (-2, 0))
f3 中使用* 运算符解压外部元组会触发语法错误。

正确的语法是什么?


另外我不明白为什么 f2 是 ((5, 0), (-5, 0)) ((2, 0), (-2, 0)),其中外部元组没有被 , 分隔?

【问题讨论】:

  • 我根本不会使用循环。 [(a, 0), (-a, 0), (b, 0), (-b, 0)] if c else [(0, a), (0, -a), (0, b), (0, -b)]
  • 为什么你需要调用tuple(),而你只能使用元组文字语法?
  • 不过,f2 = [((m,0), (-m,0)) if c else ((0,m), (-0,-m)) for m in (a,b)] 不是。您不需要在这里联系tuple(),但@OlvinR​​oght 的建议可能是正确的,我只是在旁边挖掘

标签: python tuples list-comprehension


【解决方案1】:

您可以使用 lambda 函数来完成。

x1 = lambda x : (x,0)
y1 = lambda x : (-x,0)
x2 = lambda x : (0,x)
y2 = lambda x : (-0,-x)
f2 = [f1(m) if c else f2(m) for m in (a,b) for f1,f2 in zip((x1,y1),(x2,y2))] 

输出:
[(5, 0), (-5, 0), (2, 0), (-2, 0)]
有点过度设计,但有道理。

编辑
您还可以使用 itertools 中的链将 2 个项目放入单个列表理解中。

from itertools import chain
f2 = list(
    chain.from_iterable(
        ((m,0), (-m,0)) if c else ((0,m), (-0,-m)) for m in (a,b)
    ))

SEE

【讨论】:

  • @mins 是的,我考虑了一下,想出了链条。有关更多信息,请查看(答案)[stackoverflow.com/a/11868996/9354135]
  • chain.from_iterable() 是实现嵌套循环的功能方式。来自 this 评论的嵌套列表理解完全相同。
  • @mins,实际上不需要“技巧”[(j, 0) if c else (0, j) for i in (a, b) for j in (i, -i)]
【解决方案2】:

在这种情况下你真的不需要任何循环,你可以使用条件:

a = 5
b = 2
c = a > b

f2 = [(a, 0), (-a, 0), (b, 0), (-b, 0)] if c else [(0, a), (0, -a), (0, b), (0, -b)]

如果(因为某些原因)你想用列表理解来解决它,你可以使用下一步:

f2 = [(j, 0) if c else (0, j) for i in (a, b) for j in (i, -i)]

【讨论】:

    猜你喜欢
    • 2016-09-13
    • 2021-10-06
    • 2018-08-06
    • 1970-01-01
    • 1970-01-01
    • 2016-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多