Cách chia danh sách thành từng cặp theo tất cả các cách có thể


81

Tôi có một danh sách (nói 6 yếu tố cho đơn giản)

L = [0, 1, 2, 3, 4, 5]

và tôi muốn chia nó thành từng cặp theo TẤT CẢ các cách có thể. Tôi hiển thị một số cấu hình:

[(0, 1), (2, 3), (4, 5)]
[(0, 1), (2, 4), (3, 5)]
[(0, 1), (2, 5), (3, 4)]

và như thế. Ở đây (a, b) = (b, a)và thứ tự của các cặp không quan trọng, tức là

[(0, 1), (2, 3), (4, 5)] = [(0, 1), (4, 5), (2, 3)]

Tổng số cấu hình như vậy là 1*3*5*...*(N-1)nơi Nlà chiều dài của danh sách của tôi.

Làm cách nào để viết một trình tạo bằng Python cung cấp cho tôi tất cả các cấu hình có thể có cho một tùy chọn N?


2
Bạn có thể muốn xem mô-đun tiêu chuẩn đó itertoolsnếu bạn chưa có. Các chức năng ở đó sẽ có thể giúp giải quyết vấn đề này (có thể là permutations, combinationshoặc các productchức năng).
dappawit

Nếu thứ tự không quan trọng, bạn có thể nên sử dụng bộ hoặc bộ xếp hình.
asmeurer

Trong ngôn ngữ tổ hợp, bạn muốn tạo tất cả các kết hợp hoàn hảo trên một tập hợp nhất định (trong một biểu đồ hoàn chỉnh).
Ngày lễ tình nhân

Câu trả lời:


101

Hãy nhìn vào itertools.combinations.

matt@stanley:~$ python
Python 2.6.5 (r265:79063, Apr 16 2010, 13:57:41) 
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import itertools
>>> list(itertools.combinations(range(6), 2))
[(0, 1), (0, 2), (0, 3), (0, 4), (0, 5), (1, 2), (1, 3), (1, 4), (1, 5), (2, 3), (2, 4), (2, 5), (3, 4), (3, 5), (4, 5)]

47
Đó không phải là những gì các câu hỏi yêu cầu ... nhưng không xảy ra được những gì tôi đang tìm kiếm :)
gatoatigrado

4
Tại sao đây là câu trả lời được ủng hộ nhiều nhất? Nó dường như không trả lời câu hỏi.
Halbort

11
Nó trả lời câu hỏi của hầu hết những người đến trang web này.
Đài kiểm soát

2
@Halbort Nó trả lời tiêu đề, vì vậy nó giúp rất nhiều người. Thêm vào đó, đây chắc chắn là vấn đề chính mà OP gặp phải. Đây là sự kết hợp của một tệp có thể lặp lại , bây giờ hãy chia nhỏ nó theo cách bạn muốn.
OJFord

@OJFord Tôi không thực sự nghĩ rằng điều này trả lời cho tiêu đề: Tôi nghĩ rằng "tách" danh sách ngụ ý rằng chúng ta kết thúc với các tập con rời rạc của bản gốc. Tôi cho rằng câu trả lời này là câu trả lời, "Làm thế nào để tạo ra tất cả các cặp có thể có từ một danh sách". Tôi cho rằng, tuy nhiên, vẫn có thể đúng rằng đây là câu trả lời mà hầu hết mọi người đang tìm kiếm.
Zack

39

Tôi không nghĩ rằng có bất kỳ chức năng nào trong thư viện chuẩn thực hiện chính xác những gì bạn cần. Chỉ sử dụng itertools.combinationscó thể giúp bạn có được danh sách tất cả các cặp riêng lẻ có thể có, nhưng không thực sự giải quyết được vấn đề của tất cả các kết hợp cặp hợp lệ.

Bạn có thể giải quyết vấn đề này một cách dễ dàng với:

import itertools
def all_pairs(lst):
    for p in itertools.permutations(lst):
        i = iter(p)
        yield zip(i,i)

Nhưng điều này sẽ khiến bạn nhận được các bản sao vì nó coi (a, b) và (b, a) là khác nhau, đồng thời cung cấp tất cả các tổ hợp cặp. Cuối cùng, tôi nhận ra rằng việc viết mã này từ đầu dễ hơn là cố gắng lọc kết quả, vì vậy đây là chức năng chính xác.

def all_pairs(lst):
    if len(lst) < 2:
        yield []
        return
    if len(lst) % 2 == 1:
        # Handle odd length list
        for i in range(len(lst)):
            for result in all_pairs(lst[:i] + lst[i+1:]):
                yield result
    else:
        a = lst[0]
        for i in range(1,len(lst)):
            pair = (a,lst[i])
            for rest in all_pairs(lst[1:i]+lst[i+1:]):
                yield [pair] + rest

Nó đệ quy, vì vậy nó sẽ gặp vấn đề về ngăn xếp với một danh sách dài, nhưng nếu không thì sẽ làm được những gì bạn cần.

>>> cho x trong all_pairs ([0,1,2,3,4,5]):
    in x

[(0, 1), (2, 3), (4, 5)]
[(0, 1), (2, 4), (3, 5)]
[(0, 1), (2, 5), (3, 4)]
[(0, 2), (1, 3), (4, 5)]
[(0, 2), (1, 4), (3, 5)]
[(0, 2), (1, 5), (3, 4)]
[(0, 3), (1, 2), (4, 5)]
[(0, 3), (1, 4), (2, 5)]
[(0, 3), (1, 5), (2, 4)]
[(0, 4), (1, 2), (3, 5)]
[(0, 4), (1, 3), (2, 5)]
[(0, 4), (1, 5), (2, 3)]
[(0, 5), (1, 2), (3, 4)]
[(0, 5), (1, 3), (2, 4)]
[(0, 5), (1, 4), (2, 3)]

14
Theo mặc định, Python có một ngăn xếp trả về sâu 1000 cuộc gọi. Bạn đang lặp lại các cặp chữ số, vì vậy đây không phải là vấn đề cho đến khi danh sách của bạn dài gần 2000 mục. Chỉ với 50 mặt hàng, bạn nhận được nhiều hơn 5 * 10 ^ 31 kết hợp; bạn sẽ phải tính toán hàng tỷ năm trước khi độ sâu ngăn xếp trở thành một vấn đề.
Hugh Bothwell

4
Đây là cách cổ điển để viết điều này.
hughdbrown,

Có vẻ như có vấn đề với câu trả lời này (chạy Python 2.7.11). Dòng đầu tiên của kết quả khi chạy chính xác lợi nhuận cùng mã: [(0, 1), (2, 3), 4].
Alceu Costa

2
Xin lỗi, tôi chắc chắn rằng câu trả lời đã được viết với mục đích tốt nhất, nhưng nó không chính xác đối với tất cả các danh sách đầu vào có độ dài lẻ
Moritz Walter

1
@MoritzWalter Bạn mong đợi đầu ra là gì cho danh sách đầu vào có độ dài lẻ? Đối với tôi, câu hỏi thậm chí không có ý nghĩa nếu các danh sách có độ dài kỳ lạ, vì nó không thể được chia thành từng cặp.
Zack

15

Còn cái này thì sao:

items = ["me", "you", "him"]
[(items[i],items[j]) for i in range(len(items)) for j in range(i+1, len(items))]

[('me', 'you'), ('me', 'him'), ('you', 'him')]

hoặc là

items = [1, 2, 3, 5, 6]
[(items[i],items[j]) for i in range(len(items)) for j in range(i+1, len(items))]

[(1, 2), (1, 3), (1, 5), (1, 6), (2, 3), (2, 5), (2, 6), (3, 5), (3, 6), (5, 6)]

1
tốt, nó không nhóm các bộ cặp
Janus Troelsen

9

Về mặt khái niệm tương tự như câu trả lời của @ shang, nhưng nó không giả định rằng các nhóm có quy mô 2:

import itertools

def generate_groups(lst, n):
    if not lst:
        yield []
    else:
        for group in (((lst[0],) + xs) for xs in itertools.combinations(lst[1:], n-1)):
            for groups in generate_groups([x for x in lst if x not in group], n):
                yield [group] + groups

pprint(list(generate_groups([0, 1, 2, 3, 4, 5], 2)))

Điều này mang lại:

[[(0, 1), (2, 3), (4, 5)],
 [(0, 1), (2, 4), (3, 5)],
 [(0, 1), (2, 5), (3, 4)],
 [(0, 2), (1, 3), (4, 5)],
 [(0, 2), (1, 4), (3, 5)],
 [(0, 2), (1, 5), (3, 4)],
 [(0, 3), (1, 2), (4, 5)],
 [(0, 3), (1, 4), (2, 5)],
 [(0, 3), (1, 5), (2, 4)],
 [(0, 4), (1, 2), (3, 5)],
 [(0, 4), (1, 3), (2, 5)],
 [(0, 4), (1, 5), (2, 3)],
 [(0, 5), (1, 2), (3, 4)],
 [(0, 5), (1, 3), (2, 4)],
 [(0, 5), (1, 4), (2, 3)]]

5

Sếp của tôi có lẽ sẽ không vui vì tôi đã dành một ít thời gian cho vấn đề thú vị này, nhưng đây là một giải pháp hay mà không cần đệ quy và sử dụng itertools.product. Nó được giải thích trong docstring :). Kết quả có vẻ ổn, nhưng tôi đã không thử nghiệm nó quá nhiều.

import itertools


def all_pairs(lst):
    """Generate all sets of unique pairs from a list `lst`.

    This is equivalent to all _partitions_ of `lst` (considered as an indexed
    set) which have 2 elements in each partition.

    Recall how we compute the total number of such partitions. Starting with
    a list

    [1, 2, 3, 4, 5, 6]

    one takes off the first element, and chooses its pair [from any of the
    remaining 5].  For example, we might choose our first pair to be (1, 4).
    Then, we take off the next element, 2, and choose which element it is
    paired to (say, 3). So, there are 5 * 3 * 1 = 15 such partitions.

    That sounds like a lot of nested loops (i.e. recursion), because 1 could
    pick 2, in which case our next element is 3. But, if one abstracts "what
    the next element is", and instead just thinks of what index it is in the
    remaining list, our choices are static and can be aided by the
    itertools.product() function.
    """
    N = len(lst)
    choice_indices = itertools.product(*[
        xrange(k) for k in reversed(xrange(1, N, 2)) ])

    for choice in choice_indices:
        # calculate the list corresponding to the choices
        tmp = lst[:]
        result = []
        for index in choice:
            result.append( (tmp.pop(0), tmp.pop(index)) )
        yield result

chúc mừng!


một tên chính xác hơn nên all_pairingsxrangenên được thay thế bằng rangebằng Python 3.
Valentas

Việc triển khai là rõ ràng, nhưng nó không hoạt động đối với danh sách có số phần tử lẻ.
Cronos

4

Hãy thử chức năng tạo đệ quy sau:

def pairs_gen(L):
    if len(L) == 2:
        yield [(L[0], L[1])]
    else:
        first = L.pop(0)
        for i, e in enumerate(L):
            second = L.pop(i)
            for list_of_pairs in pairs_gen(L):
                list_of_pairs.insert(0, (first, second))
                yield list_of_pairs
            L.insert(i, second)
        L.insert(0, first)

Ví dụ sử dụng:

>>> for pairs in pairs_gen([0, 1, 2, 3, 4, 5]):
...     print pairs
...
[(0, 1), (2, 3), (4, 5)]
[(0, 1), (2, 4), (3, 5)]
[(0, 1), (2, 5), (3, 4)]
[(0, 2), (1, 3), (4, 5)]
[(0, 2), (1, 4), (3, 5)]
[(0, 2), (1, 5), (3, 4)]
[(0, 3), (1, 2), (4, 5)]
[(0, 3), (1, 4), (2, 5)]
[(0, 3), (1, 5), (2, 4)]
[(0, 4), (1, 2), (3, 5)]
[(0, 4), (1, 3), (2, 5)]
[(0, 4), (1, 5), (2, 3)]
[(0, 5), (1, 2), (3, 4)]
[(0, 5), (1, 3), (2, 4)]
[(0, 5), (1, 4), (2, 3)]

3

Một hàm không đệ quy để tìm tất cả các cặp có thể có trong đó thứ tự không quan trọng, tức là, (a, b) = (b, a)

def combinantorial(lst):
    count = 0
    index = 1
    pairs = []
    for element1 in lst:
        for element2 in lst[index:]:
            pairs.append((element1, element2))
        index += 1

    return pairs

Vì nó không đệ quy nên bạn sẽ không gặp vấn đề về bộ nhớ với danh sách dài.

Ví dụ về cách sử dụng:

my_list = [1, 2, 3, 4, 5]
print(combinantorial(my_list))
>>>
[(1, 2), (1, 3), (1, 4), (1, 5), (2, 3), (2, 4), (2, 5), (3, 4), (3, 5), (4, 5)]

Điều này cũng giống như itertools.combaries
Tmdean

3

Tôi đã tạo một bộ thử nghiệm nhỏ cho tất cả các giải pháp tuân thủ. Tôi đã phải thay đổi các hàm một chút để chúng hoạt động trong Python 3. Thật thú vị, hàm nhanh nhất trong PyPy là hàm chậm nhất trong Python 2/3 trong một số trường hợp.

import itertools 
import time
from collections import OrderedDict

def tokland_org(lst, n):
    if not lst:
        yield []
    else:
        for group in (((lst[0],) + xs) for xs in itertools.combinations(lst[1:], n-1)):
            for groups in tokland_org([x for x in lst if x not in group], n):
                yield [group] + groups

tokland = lambda x: tokland_org(x, 2)

def gatoatigrado(lst):
    N = len(lst)
    choice_indices = itertools.product(*[
        range(k) for k in reversed(range(1, N, 2)) ])

    for choice in choice_indices:
        # calculate the list corresponding to the choices
        tmp = list(lst)
        result = []
        for index in choice:
            result.append( (tmp.pop(0), tmp.pop(index)) )
        yield result

def shang(X):
    lst = list(X)
    if len(lst) < 2:
        yield lst
        return
    a = lst[0]
    for i in range(1,len(lst)):
        pair = (a,lst[i])
        for rest in shang(lst[1:i]+lst[i+1:]):
            yield [pair] + rest

def smichr(X):
    lst = list(X)
    if not lst:
        yield [tuple()]
    elif len(lst) == 1:
        yield [tuple(lst)]
    elif len(lst) == 2:
        yield [tuple(lst)]
    else:
        if len(lst) % 2:
            for i in (None, True):
                if i not in lst:
                    lst = lst + [i]
                    PAD = i
                    break
            else:
                while chr(i) in lst:
                    i += 1
                PAD = chr(i)
                lst = lst + [PAD]
        else:
            PAD = False
        a = lst[0]
        for i in range(1, len(lst)):
            pair = (a, lst[i])
            for rest in smichr(lst[1:i] + lst[i+1:]):
                rv = [pair] + rest
                if PAD is not False:
                    for i, t in enumerate(rv):
                        if PAD in t:
                            rv[i] = (t[0],)
                            break
                yield rv

def adeel_zafar(X):
    L = list(X)
    if len(L) == 2:
        yield [(L[0], L[1])]
    else:
        first = L.pop(0)
        for i, e in enumerate(L):
            second = L.pop(i)
            for list_of_pairs in adeel_zafar(L):
                list_of_pairs.insert(0, (first, second))
                yield list_of_pairs
            L.insert(i, second)
        L.insert(0, first)

if __name__ =="__main__":
    import timeit
    import pprint

    candidates = dict(tokland=tokland, gatoatigrado=gatoatigrado, shang=shang, smichr=smichr, adeel_zafar=adeel_zafar)

    for i in range(1,7):
        results = [ frozenset([frozenset(x) for x in candidate(range(i*2))]) for candidate in candidates.values() ]
        assert len(frozenset(results)) == 1

    print("Times for getting all permutations of sets of unordered pairs consisting of two draws from a 6-element deck until it is empty")
    times = dict([(k, timeit.timeit('list({0}(range(6)))'.format(k), setup="from __main__ import {0}".format(k), number=10000)) for k in candidates.keys()])
    pprint.pprint([(k, "{0:.3g}".format(v)) for k,v in OrderedDict(sorted(times.items(), key=lambda t: t[1])).items()])

    print("Times for getting the first 2000 permutations of sets of unordered pairs consisting of two draws from a 52-element deck until it is empty")
    times = dict([(k, timeit.timeit('list(islice({0}(range(52)), 800))'.format(k), setup="from itertools import islice; from __main__ import {0}".format(k), number=100)) for k in candidates.keys()])
    pprint.pprint([(k, "{0:.3g}".format(v)) for k,v in OrderedDict(sorted(times.items(), key=lambda t: t[1])).items()])

    """
    print("The 10000th permutations of the previous series:")
    gens = dict([(k,v(range(52))) for k,v in candidates.items()])
    tenthousands = dict([(k, list(itertools.islice(permutations, 10000))[-1]) for k,permutations in gens.items()])
    for pair in tenthousands.items():
        print(pair[0])
        print(pair[1])
    """

Tất cả chúng dường như tạo ra cùng một thứ tự chính xác, vì vậy các bộ không cần thiết, nhưng theo cách này, đó là bằng chứng trong tương lai. Tôi đã thử nghiệm một chút với chuyển đổi Python 3, không phải lúc nào cũng rõ ràng nơi tạo danh sách, nhưng tôi đã thử một số lựa chọn thay thế và chọn cách nhanh nhất.

Đây là kết quả điểm chuẩn:

% echo "pypy"; pypy all_pairs.py; echo "python2"; python all_pairs.py; echo "python3"; python3 all_pairs.py
pypy
Times for getting all permutations of sets of unordered pairs consisting of two draws from a 6-element deck until it is empty
[('gatoatigrado', '0.0626'),
 ('adeel_zafar', '0.125'),
 ('smichr', '0.149'),
 ('shang', '0.2'),
 ('tokland', '0.27')]
Times for getting the first 2000 permutations of sets of unordered pairs consisting of two draws from a 52-element deck until it is empty
[('gatoatigrado', '0.29'),
 ('adeel_zafar', '0.411'),
 ('smichr', '0.464'),
 ('shang', '0.493'),
 ('tokland', '0.553')]
python2
Times for getting all permutations of sets of unordered pairs consisting of two draws from a 6-element deck until it is empty
[('gatoatigrado', '0.344'),
 ('adeel_zafar', '0.374'),
 ('smichr', '0.396'),
 ('shang', '0.495'),
 ('tokland', '0.675')]
Times for getting the first 2000 permutations of sets of unordered pairs consisting of two draws from a 52-element deck until it is empty
[('adeel_zafar', '0.773'),
 ('shang', '0.823'),
 ('smichr', '0.841'),
 ('tokland', '0.948'),
 ('gatoatigrado', '1.38')]
python3
Times for getting all permutations of sets of unordered pairs consisting of two draws from a 6-element deck until it is empty
[('gatoatigrado', '0.385'),
 ('adeel_zafar', '0.419'),
 ('smichr', '0.433'),
 ('shang', '0.562'),
 ('tokland', '0.837')]
Times for getting the first 2000 permutations of sets of unordered pairs consisting of two draws from a 52-element deck until it is empty
[('smichr', '0.783'),
 ('shang', '0.81'),
 ('adeel_zafar', '0.835'),
 ('tokland', '0.969'),
 ('gatoatigrado', '1.3')]
% pypy --version
Python 2.7.12 (5.6.0+dfsg-0~ppa2~ubuntu16.04, Nov 11 2016, 16:31:26)
[PyPy 5.6.0 with GCC 5.4.0 20160609]
% python3 --version
Python 3.5.2

Vì vậy, tôi nói, đi với giải pháp của gatoatigrado.


2
def f(l):
    if l == []:
        yield []
        return
    ll = l[1:]
    for j in range(len(ll)):
        for end in f(ll[:j] + ll[j+1:]):
            yield [(l[0], ll[j])] + end

Sử dụng:

for x in f([0,1,2,3,4,5]):
    print x

>>> 
[(0, 1), (2, 3), (4, 5)]
[(0, 1), (2, 4), (3, 5)]
[(0, 1), (2, 5), (3, 4)]
[(0, 2), (1, 3), (4, 5)]
[(0, 2), (1, 4), (3, 5)]
[(0, 2), (1, 5), (3, 4)]
[(0, 3), (1, 2), (4, 5)]
[(0, 3), (1, 4), (2, 5)]
[(0, 3), (1, 5), (2, 4)]
[(0, 4), (1, 2), (3, 5)]
[(0, 4), (1, 3), (2, 5)]
[(0, 4), (1, 5), (2, 3)]
[(0, 5), (1, 2), (3, 4)]
[(0, 5), (1, 3), (2, 4)]
[(0, 5), (1, 4), (2, 3)]

Rất tiếc, không thấy câu trả lời của shang, câu trả lời tương tự ... tôi có nên xóa câu trả lời này không?
Jules Olléon

Không cần phải xóa, nhưng việc sử dụng tên biến thực của shang sẽ tốt hơn.
gatoatigrado 22/10/12

2

Hy vọng điều này sẽ giúp:

L = [0, 1, 2, 3, 4, 5]

[(i, j) for i in L for j in L]

đầu ra:

[(0, 0), (0, 1), (0, 2), (0, 3), (0, 4), (0, 5), (1, 0), (1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (2, 0), (2, 1), (2, 2), (2, 3), (2, 4), (2, 5), (3, 0), (3, 1), (3, 2), (3, 3), (3, 4), (3, 5), (4, 0), (4, 1), (4, 2), (4, 3), (4, 4), (4, 5), (5, 0), (5, 1), (5, 2), (5, 3), (5, 4), (5, 5)]


1

Mã này hoạt động khi độ dài của danh sách không phải là bội số của 2; nó sử dụng một bản hack để làm cho nó hoạt động. Có lẽ có nhiều cách tốt hơn để làm điều này ... Nó cũng đảm bảo rằng các cặp luôn ở trong một bộ và nó hoạt động cho dù đầu vào là một danh sách hay tuple.

def all_pairs(lst):
    """Return all combinations of pairs of items of ``lst`` where order
    within the pair and order of pairs does not matter.

    Examples
    ========

    >>> for i in range(6):
    ...  list(all_pairs(range(i)))
    ...
    [[()]]
    [[(0,)]]
    [[(0, 1)]]
    [[(0, 1), (2,)], [(0, 2), (1,)], [(0,), (1, 2)]]
    [[(0, 1), (2, 3)], [(0, 2), (1, 3)], [(0, 3), (1, 2)]]
    [[(0, 1), (2, 3), (4,)], [(0, 1), (2, 4), (3,)], [(0, 1), (2,), (3, 4)], [(0, 2)
    , (1, 3), (4,)], [(0, 2), (1, 4), (3,)], [(0, 2), (1,), (3, 4)], [(0, 3), (1, 2)
    , (4,)], [(0, 3), (1, 4), (2,)], [(0, 3), (1,), (2, 4)], [(0, 4), (1, 2), (3,)],
     [(0, 4), (1, 3), (2,)], [(0, 4), (1,), (2, 3)], [(0,), (1, 2), (3, 4)], [(0,),
    (1, 3), (2, 4)], [(0,), (1, 4), (2, 3)]]

    Note that when the list has an odd number of items, one of the
    pairs will be a singleton.

    References
    ==========

    http://stackoverflow.com/questions/5360220/
    how-to-split-a-list-into-pairs-in-all-possible-ways

    """
    if not lst:
        yield [tuple()]
    elif len(lst) == 1:
        yield [tuple(lst)]
    elif len(lst) == 2:
        yield [tuple(lst)]
    else:
        if len(lst) % 2:
            for i in (None, True):
                if i not in lst:
                    lst = list(lst) + [i]
                    PAD = i
                    break
            else:
                while chr(i) in lst:
                    i += 1
                PAD = chr(i)
                lst = list(lst) + [PAD]
        else:
            PAD = False
        a = lst[0]
        for i in range(1, len(lst)):
            pair = (a, lst[i])
            for rest in all_pairs(lst[1:i] + lst[i+1:]):
                rv = [pair] + rest
                if PAD is not False:
                    for i, t in enumerate(rv):
                        if PAD in t:
                            rv[i] = (t[0],)
                            break
                yield rv

0
L = [1, 1, 2, 3, 4]
answer = []
for i in range(len(L)):
    for j in range(i+1, len(L)):
        if (L[i],L[j]) not in answer:
            answer.append((L[i],L[j]))

print answer
[(1, 1), (1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)]

Hi vọng điêu nay co ich


-1

Không phải là hiệu quả nhất hoặc nhanh nhất, nhưng có lẽ là dễ dàng nhất. Dòng cuối cùng là một cách đơn giản để loại trừ một danh sách trong python. Trong trường hợp này, các cặp như (0,1) và (1,0) nằm trong đầu ra. Không chắc liệu bạn có xem xét những bản sao đó hay không.

l = [0, 1, 2, 3, 4, 5]
pairs = []
for x in l:
    for y in l:
        pairs.append((x,y))
pairs = list(set(pairs))
print(pairs)

Đầu ra:

[(0, 0), (0, 1), (0, 2), (0, 3), (0, 4), (0, 5), (1, 0), (1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (2, 0), (2, 1), (2, 2), (2, 3), (2, 4), (2, 5), (3, 0), (3, 1), (3, 2), (3, 3), (3, 4), (3, 5), (4, 0), (4, 1), (4, 2), (4, 3), (4, 4), (4, 5), (5, 0), (5, 1), (5, 2), (5, 3), (5, 4), (5, 5)]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.