【问题标题】:Combinations between values of lists列表值之间的组合
【发布时间】:2016-04-19 14:44:07
【问题描述】:

假设我有以下列表:

letters = ['a','b','c']
numbers = ['one','two']
others = ['here','there']

我想要所有值的所有可能组合。我正在执行以下操作:

from itertools import permutations
b = []
b.extend(letters)
b.extend(numbers)
b.extend(others)
result1 = list(permutations(b,2))

结果还可以。但我更具体地想要了解组合的“类型”。例如结果应该是:

('a','b','letters-letters')

('a','one','letters-numbers')
('one','a','letters-numbers')

我正在使用以下代码:

from itertools import product
result2=[]
result2.extend([x+('letter-letter',) for x in list(permutations(letters ,2))])
result2.extend([x+('number-number',) for x in list(permutations(numbers,2))])
result2.extend([x+('other-other',) for x in list(permutations(others,2))])
result2.extend([x+('number-letter',) for x in list(product(numbers,letters))])
result2.extend([x+('number-letter',) for x in list(product(letters,numbers))])   
result2.extend([x+('number-others',) for x in list(product(numbers,others))])  
result2.extend([x+('number-others',) for x in list(product(others,numbers))])   
result2.extend([x+('letters-others',) for x in list(product(letters,others))])    
result2.extend([x+('letters-others',) for x in list(product(others,letters))])   

有没有更快速、更优雅的方法?

【问题讨论】:

    标签: python itertools


    【解决方案1】:

    IIUC,关键是将元素所属的数据系列耦合到元素。例如:

    from itertools import permutations
    
    data = {'letters': ['a','b','c'],
            'numbers': ['one','two'],
            'others': ['here','there']}
    
    poss = [(v,k) for k, vv in data.items() for v in vv]
    results = (list(zip(*p)) for p in permutations(poss, 2))
    results = [p[0] + ('-'.join(p[1]),) for p in results]
    

    给我

    [('a', 'b', 'letters-letters'),
     ('a', 'c', 'letters-letters'),
     ('a', 'here', 'letters-others'),
     ...
     ('two', 'here', 'numbers-others'),
     ('two', 'there', 'numbers-others'),
     ('two', 'one', 'numbers-numbers')]
    

    这很有效,因为我们从 poss 开始看起来像

    >>> poss[:3]
    [('a', 'letters'), ('b', 'letters'), ('c', 'letters')]
    

    然后从中选择两个元素,使用 zip-star 将每个选定的对变成类似的东西

    >>> next(list(zip(*p)) for p in permutations(poss, 2))
    [('a', 'b'), ('letters', 'letters')]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-09
      • 1970-01-01
      • 2022-12-20
      • 2019-06-15
      • 2013-02-23
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      相关资源
      最近更新 更多