0

以下のようなリストがあるとしましょう:

foo = [256, 456, 24, 79, 14]
bar = ['a', 'aa', 'dd', 'e', 'b']
baz = [2.9, 2.7, 1.9, 2.2, 1.1] 

foo のペアを取得したいのですが ( を使用できることはわかっていますiterools.combinations)、 で要素のペアを取得するときに、 andfooで対応するペアを取得するにはどうすればよいですか?barbaz

たとえば、 と をペアリングする場合256456とを同じ順序でfooペアリングし、 ?でと を同じ順序でペアリングします。'a''aa'bar2.92.7baz

また、組み合わせを取得する場合、上記の順序で並べられたリストを挿入すると、実際には順列ではなく組み合わせを取得する必要があるため、両方が出力される(256, 456)ことを恐れる必要はありませんか?(456, 256)

4

3 に答える 3

1

これは、任意の数のリストから組み合わせをグループ化するための一般的な関数です。

>>> def grouped_combos(n, *ls):
...     for comb in itertools.combinations(zip(*ls), n):
...         yield comb
>>> list(grouped_combos(2, [256, 456, 24, 79, 14], ['a', 'aa', 'dd', 'e', 'b']))
[((256, 'a'), (456, 'aa')), 
 ((256, 'a'), (24, 'dd')), 
 ((256, 'a'), (79, 'e')), 
 ((256, 'a'), (14, 'b')), 
 ((456, 'aa'), (24, 'dd')), 
 ((456, 'aa'), (79, 'e')), 
 ((456, 'aa'), (14, 'b')), 
 ((24, 'dd'), (79, 'e')), 
 ((24, 'dd'), (14, 'b')), 
 ((79, 'e'), (14, 'b'))]
>>> list(grouped_combos(4, [1, 2, 3, 4, 5], "abcde", "xyzzy"))
[((1, 'a', 'x'), (2, 'b', 'y'), (3, 'c', 'z'), (4, 'd', 'z')), 
 ((1, 'a', 'x'), (2, 'b', 'y'), (3, 'c', 'z'), (5, 'e', 'y')), 
 ((1, 'a', 'x'), (2, 'b', 'y'), (4, 'd', 'z'), (5, 'e', 'y')), 
 ((1, 'a', 'x'), (3, 'c', 'z'), (4, 'd', 'z'), (5, 'e', 'y')), 
 ((2, 'b', 'y'), (3, 'c', 'z'), (4, 'd', 'z'), (5, 'e', 'y'))]
于 2013-11-02T16:46:16.873 に答える
1

インデックスの組み合わせを作成し、それらのインデックスの組み合わせを使用して個々のアイテムにアクセスできます。

indexes = list(range(len(foo)))
for i, j in itertools.combinations(indexes, 2):
     print(foo[i], foo[j])
     print(bar[i], bar[j])
     print(baz[i], baz[j])
于 2013-11-02T16:44:56.517 に答える
1
for c in itertools.combinations(zip(foo, bar, baz), 2):
    for u in zip(*c):
        print(u)

出力:

(256, 456)
('a', 'aa')
(2.9, 2.7)
(256, 24)
('a', 'dd')
(2.9, 1.9)
(256, 79)
('a', 'e')
(2.9, 2.2)
(256, 14)
('a', 'b')
(2.9, 1.1)
(456, 24)
('aa', 'dd')
(2.7, 1.9)
(456, 79)
('aa', 'e')
(2.7, 2.2)
(456, 14)
('aa', 'b')
(2.7, 1.1)
(24, 79)
('dd', 'e')
(1.9, 2.2)
(24, 14)
('dd', 'b')
(1.9, 1.1)
(79, 14)
('e', 'b')
(2.2, 1.1)
于 2013-11-02T16:44:58.477 に答える