生成器表达式与for循环的丑陋组合

时间:2010-03-01 11:54:25

标签: python for-loop generator

以下内容出现在我的Python 2.6代码中:

for src, dst in ([s,d] for s in universe for d in universe if s != d):

我可以做得更好吗?我特别不喜欢的是,我实际上指定了两次相同的对,一次用于for循环,另一次用于生成器表达式。我不确定我是否愿意:

for src, dst in itertools.product(universe, universe):
    if src != dst:

有没有办法简洁地表达这个循环?

universe恰好是一个列表,如果它有任何区别。迭代次序无关紧要。

3 个答案:

答案 0 :(得分:5)

您可以使用简单的嵌套for循环:

for src in universe:
   for dst in universe:
      if src == dst:
         continue
      ...

在这种情况下,我会说这是最容易阅读的语法。

答案 1 :(得分:3)

我建议保持完全功能或完全理解。这是一个完全有效的实现。

import itertools 
import operator

def inner_product(iterable):
    "the product of an iterable with itself"
    return itertools.product(iterable, repeat=2)

def same(pair):
    "does this pair contain two of the same thing?"
    return operator.is_(*pair)

universe = 'abcd'

pairs = inner_product(universe)
unique_pairs = itertools.ifilterfalse(same, pairs)
for pair in unique_pairs:
    print pair

"""
('a', 'b')
('a', 'c')
('a', 'd')
('b', 'a')
('b', 'c')
('b', 'd')
('c', 'a')
('c', 'b')
('c', 'd')
('d', 'a')
('d', 'b')
('d', 'c')
"""

答案 2 :(得分:1)

如果你想拥有与多个参数相同的序列,那么

itertools.product可以采用“repeat”关键字参数:

itertools.product(universe, repeat=2)

关于这是否更具可读性是一个意见问题。

您可以将原始代码替换为:

for (src, dest) in filter(lambda (a,b): a!=b, itertools.product(universe, repeat=2)):
    ...