【问题标题】:varible width for loop in pythonpython中循环的可变宽度
【发布时间】:2020-06-29 23:48:28
【问题描述】:

我什至不确定我是否正确描述了这一点,但我有一系列列表,我使用 izip_longest 组合在一起。

import  itertools

a = ['a1', 'a2', 'a3']
b = ['b1', 'b2', 'b3']
c = ['c1', 'c2', 'c3']


group = []
for i in (filter(None, g) for g in itertools.izip_longest(a, b, c)):
    group.append(i)

我用 for 循环跟随它

for idx, (x, y, z) in enumerate(group):
    print('Got ' + x + ', ' + y + ', ' + z)

但是,有时我会遇到进入izip_longest 的一个或多个列表为空的情况

例如

a = ['a1', 'a2', 'a3']
b = []
c = ['c1', 'c2', 'c3'] 

这会导致for 循环出现问题。如何从 for 循环中指定可变数量的“输出参数”(不确定这是正确的术语)...

例如如果列表 b 为空,则使 for 循环类似于

for idx, (x,z) in enumerate(group):
   ...

【问题讨论】:

  • 总会有一个......我可以做类似((x,*_))的事情吗?但是循环体中如何引用这些附加变量?

标签: python-3.x loops itertools


【解决方案1】:

确实,如果您确切知道集合有多大,则应该只使用解包语法 ((x, y, z))。有一些解决方法,比如使用“rest operator”来获取额外内容:

(a, b, *z) = [1, 2, 3, 4, 5]

>>> z
[3, 4, 5]

但这很丑陋,据我所知,没有一个很好的方法来获取少于一定数量的东西。

如果集合的大小可以变化,我会将其视为一个列表,并根据需要从中检查/提取数据。在您的特定示例中,这可以通过join 轻松完成:

for idx, members in enumerate(group):
    print('Got ' + ', '.join(members))

当然,在更复杂的场景中,您可能希望引用单个元素。在这种情况下,使用getting an element with a default 的某种方式会起作用,或者只是使用if 从头开始​​检查

我认为在这里强制拆包会使事情复杂化;不过,我很想被证明是错误的。

【讨论】:

  • 我会试一试...问题是我需要使用只允许一个输入变量的方法访问每个成员(变量号)...所以我认为我需要嵌入另一个循环。
  • @agf1997 我需要看一个你正在尝试做的最小示例。
  • 是的,对不起......显然问题范围比我最初预期的要大一些。让我看看我能做些什么。
猜你喜欢
  • 2018-08-30
  • 1970-01-01
  • 2016-06-28
  • 2018-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多