簡體   English   中英

如何確定數字組合是否在另一個數字組合中?

[英]How do I find out if a combination of numbers are in another combination of numbers?

有沒有辦法找出數字組合(存儲在列表中)是否在更長的數字組合中(存儲在單獨的列表中)?

例如

mylist = [(1, 4, 7), (3, 6, 9)]

serieslist = list(itertools.combinations((range(1, 50)), 5))
>> [(1, 2, 3, 4, 5), (1, 2, 3, 4, 6), (1, 2, 3, 4, 7)...etc...]

在上面的例子中,我想要返回的是數字組合(1, 4, 7) 數字組合(1, 2, 3, 4, 7)

具體地,雖然,我不想拆分(1, 2, 3, 4, 7)為三個的其它組合。

理想情況下,我想將其寫入for語句,以將mylist的每個元素與serieslist每個元素進行serieslist

使用集來查看你的元組是否是更大元組的一部分:

if set(short_tuple).issubset(longer_tuple):
    # all elements of short_tuple are in longer_tuple

要打開short_tuple成為一個集一次

for short_tuple in mylist:
    short_tuple_set = set(short_tuple)

    for combo in itertools.combinations((range(1, 50)), 5):
        if short_tuple_set.issubset(combo):
            # matched!

盡管如此,生成所有保證匹配的組合會更有效:

for short_tuple in mylist:
    short_tuple_set = set(short_tuple)

    remainder = (i for i in range(1, 50) if i not in short_tuple_set)
    for combo in itertools.combinations(remainder, 5 - len(short_tuple)):
        combo = sorted(combo + short_tuple)

每個combo是1到49之間的5個數字的有效組合,其中包含short_tuple所有3個數字, 不必創建所有可能的組合。

如果將它們創建為生成器函數,則可以驗證它們是否生成相同的輸出(除了元組與列表之外; sorted()返回列表):

>>> def set_test(mylist):
...     for short_tuple in mylist:
...         short_tuple_set = set(short_tuple)
...         for combo in itertools.combinations((range(1, 50)), 5):
...             if short_tuple_set.issubset(combo):
...                 yield combo
... 
>>> def create_combos(mylist):
...     for short_tuple in mylist:
...         short_tuple_set = set(short_tuple)
...         remainder = (i for i in range(1, 50) if i not in short_tuple_set)
...         for combo in itertools.combinations(remainder, 5 - len(short_tuple)):
...             combo = sorted(combo + short_tuple)
...             yield combo
... 
>>> all(a == tuple(b) for a, b in itertools.izip_longest(set_test(mylist), create_combos(mylist)))
True

但第二種方法是如此之快:

>>> timeit('list(f(mylist))', 'from __main__ import set_test as f, mylist', number=10)
14.483195066452026
>>> timeit('list(f(mylist))', 'from __main__ import create_combos as f, mylist', number=10)
0.019912004470825195

是的,這快了近1000倍

如果所有序列僅包含唯一編號(無重復):

a = (1,4,7)
b = (1,2,3,4,7)
a_in_b = all(x in b for x in a)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM