繁体   English   中英

确定两个列表中的元素是否相同的有效方法

[英]Efficient way to determine if elements in two lists are the same

我试图在 32 个选择(496 种可能性)的总体中找到 4 的独特组合,然后我将它们配对成一个矩阵(因此矩阵可能高达 496 x 496 或 25,000 个单元格)。 但是(使用数字表示选择)这意味着我有一些重复项 (1,2) 与 (3,4) 匹配与 (1,3) 与 (2,4) 匹配相同。 我需要做的是找到重复项(相同的四个选择,无论顺序如何)并将它们标记为重复项。 我玩过这个并阅读了我能找到的所有内容。 在这个问题中( https://www.csestack.org/compare-two-lists-python-return-non-match-elements/ )我开始了。 但是我的列表不同——它们看起来像 list_e 和 list_f 中的元素(见下面的代码),它们不会显示为重复项,即使玩家 2、4、6 和 8 出现在每个列表中。 理想情况下,我想找到一种方法来比较 list_e 和 list_f 并将它们注册为重复项。 如果我必须重新格式化 list_e 和 list_f 的内容,以便它们具有与 list_a 和 list_b 相同的结构,那至少可以完成工作。 但是,由于我有很多比较,所以我想以最有效的方式进行比较。

在此先感谢您的帮助。

    if len(list_a) != len(list_b):
        return False
    if set(list_a) == set(list_b):
        return True
    else:
        return False
         
 
list_a = [2, 4, 6, 8]
list_b = [2, 8, 6, 4]

list_c = [(2,4,6,8)]
list_d = [(4,6,2,8)]

list_e = [((2,4),(6,8))]
list_f = [((2,6),(4,8))]
 
if is_identical(list_a, list_b):
    print("Two lists are identical.")
else:
    print("Two lists are different.")

    
if is_identical(list_c, list_d):
    print("Two lists are identical.")
else:
    print("Two lists are different.")

if is_identical(list_e, list_f):
    print("Two lists are identical.")
else:
    print("Two lists are different.")

这将删除所有括号对其进行排序并检查列表是否相同。

a = [((1,2),(3,4))]
b = [((1,3),(2,4))]
from collections import Iterable                            # < py38


def flatten(items):
    for x in items:
        if isinstance(x, Iterable) and not isinstance(x, (str, bytes)):
            for sub_x in flatten(x):
                yield sub_x
        else:
            yield x
            
c = (list(flatten(a)))
d = (list(flatten(b)))
print(c.sort()==d.sort()) #True

我会在这里提供一些解释。

所以发生的事情是,首先您要遍历在展平 function 中传递的列表。

然后我们检查是否可以使用 isinstance 方法遍历列表,例如 (syntax) => isinstance(4, Int)将给出 boolean 值,即True

yield 给出你想要返回的任何值,这经常与return混淆,后者只给出 boolean 值

function 到此结束,现在我们只需要展平您提供的列表,使用.sort()对其进行排序并进行比较。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM