【问题标题】:how to iterate through the list, fetching each possible pair of values?如何遍历列表,获取每对可能的值?
【发布时间】:2015-03-26 18:55:29
【问题描述】:

如何遍历list(数字)并获取其每对可能的值?

示例(java):

for(int i = 0; i < 5; i++)
    for(int j = i+1; j < 5; j++)
        print(i, j); // 01, 02, 03, 04, 12, 13, 14, 23, 24, 34

我的问题是列表是通过生成器函数获取的,因此它是惰性的。此外,它可能非常大,因此将所有对保存在内存中并不是绝望的解决方案。

所以最后一个问题 - 如何在 python 中实现相同的行为,记住内存是有限的?此外,复杂性不应超过O(N^2),其中Nlist 的长度。

【问题讨论】:

  • 每一个可能的值对到底是什么意思?那对的预期格式是什么?你能添加一个输入和一个期望输出吗?
  • 我的意思是无序的 2 元组值,在 java 示例中的注释中打印。

标签: python list iteration generator


【解决方案1】:

其实你想要的组合,你可以使用itertools.combinations函数:

>>> from itertools import combinations
>>> list(combinations(range(5),2))
[(0, 1), (0, 2), (0, 3), (0, 4), (1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)]

如果你想连接结果,你可以将元素转换为字符串然后join他们:

>>> [''.join(map(str,i)) for i in combinations(range(5),2)]
['01', '02', '03', '04', '12', '13', '14', '23', '24', '34']

作为获得预期输出的更有效方法,您可以使用包含从 0 到 5 的所有数字的字符串:

>>> from string import digits
>>> [''.join(i) for i in combinations(digits[:5],2)]
['01', '02', '03', '04', '12', '13', '14', '23', '24', '34']

【讨论】:

  • 为你干杯,不要过度迭代(列出它,而不是迭代)迭代器。
【解决方案2】:

您可以使用itertools.combinations

list(itertools.combinations(range(5), 2))
Out[7]: 
[(0, 1),
 (0, 2),
 (0, 3),
 (0, 4),
 (1, 2),
 (1, 3),
 (1, 4),
 (2, 3),
 (2, 4),
 (3, 4)]

或者从对中创建字符串:

[''.join(str(i) for i in p) for p in itertools.combinations(range(5), 2)]
Out[8]: ['01', '02', '03', '04', '12', '13', '14', '23', '24', '34']

【讨论】:

    【解决方案3】:

    像这样(没有库):

    lst = [0, 1, 2, 3, 4]
    
    newlst = [(y,z) for y in lst for z in lst]
    output = set(['%s%s' % (x[0], x[1]) for x in newlst])
    

    或者,作为单行(即不可读):

    set(['%s%s' % (x[0], x[1]) for x in [(y, z) for y in lst for z in lst]])
    

    【讨论】:

    • 这不会产生预期的输出,因为您的解决方案会在 2 个位置(重复)上生成 5 个元素的所有排列。
    【解决方案4】:

    我认为我们都忽略了最简单的解决方案...

    from itertools import combinations
    for x in combinations(range(5), 2):
        print x
    

    【讨论】:

      【解决方案5】:

      试试这个

      from itertools import combination
      >>>[''.join(map(str, i)) for i in combinations(range(5), 2)]
      ['01', '02', '03', '04', '12', '13', '14', '23', '24', '34']
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-09-21
        • 1970-01-01
        • 2019-04-08
        • 2021-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多