The pythonic way to generate pairs

僤鯓⒐⒋嵵緔 提交于 2019-11-30 14:28:43

问题


I want something like code below, but "pythonic" style or using standard library:

def combinations(a,b):
    for i in a:
        for j in b:
             yield(i,j)

回答1:


These are not really "combinations" in the sense of combinatorics, these are rather elements from the cartesian product of a and b. The function in the standard library to generate these pairs is itertools.product():

for i, j in itertools.product(a, b):
    # whatever



回答2:


As @Sven said, your code is attempting to get all ordered pairs of elements of the lists a and b. In this case itertools.product(a,b) is what you want. If instead you actually want "combinations", which are all unordered pairs of distinct elements of the list a, then you want itertools.combinations(a,2).

>>> for pair in itertools.combinations([1,2,3,4],2):
...    print pair
...
(1, 2)
(1, 3)
(1, 4)
(2, 3)
(2, 4)
(3, 4)



回答3:


The itertools library has combinatorics functions. Like Sven stated, itertools.product would be the appropriate function in this case:

list(itertools.product('ab', 'cd'))
[('a', 'c'), ('a', 'd'), ('b', 'c'), ('b', 'd')]



回答4:


A nested generator expression will work too:

product = ((i, j) for i in a for j in b)
for i, j in product:
    # ...



回答5:


>>>a=[1,2,3]
>>>b=[4,5,6]
>>>zip(a,b)
[(1, 4), (2, 5), (3, 6)] 



回答6:


A question we might ask is whether you want to generate all ordered pairs or all unordered pairs. The nested generator expression provided in the answer by mhyfritz will give you all ordered pairs.

If you want all unordered pairs (that is, (1, 2) and (2, 1) counts as the same pair), then you need to filter out the duplicates. An easy way to do this is to add a conditional to the end of the generator expression like so:

myList= [1, 2, 3, 4, 5]
unorderedPairGenerator = ((x, y) for x in myList for y in myList if y > x)
for pair in unorderedPairGenerator:
    print(pair)
#(1, 2)
#(1, 3)
#(1, 4)
#(1, 5)
#(2, 3)
#(2, 4)
#(2, 5)
#(3, 4)
#(3, 5)
#(4, 5)

As an aside, I was given a question similar to this in a software interview, where they wanted me to generate all pairs from a list of numbers (without using a library function). At first I generated all the ordered pairs, and then they asked me to only generate the unordered pairs. Being able to work with permutations and combinations is a pretty essential coding skill!




回答7:


Create set of pairs (even,odd) combination

>>> a = { (i,j) for i in range(0,10,2) for j in range(1,10,2)}  
>>> a
{(4, 7), (6, 9), (0, 7), (2, 1), (8, 9), (0, 3), (2, 5), (8, 5), (4, 9), (6, 7), (2, 9), (8, 1), (6, 3), (4, 1), (4, 5), (0, 5), (2, 3), (8, 7), (6, 5), (0, 1), (2, 7), (8, 3), (6, 1), (4, 3), (0, 9)}

def combinations(lista, listb):
    return { (i,j) for i in lista for j in listb }

>>> combinations([1,3,5,6],[11,21,133,134,443])
{(1, 21), (5, 133), (5, 11), (5, 134), (6, 11), (6, 134), (1, 443), (3, 11), (6, 21), (3, 21), (1, 133), (1, 134), (5, 21), (3, 134), (5, 443), (6, 443), (1, 11), (3, 443), (6, 133), (3, 133)}


来源:https://stackoverflow.com/questions/6499327/the-pythonic-way-to-generate-pairs

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!