匹配顺序无关紧要的集合中的确切元素

时间:2017-12-27 08:11:13

标签: python set

我是python的新手,我正在尝试匹配两个集合之间的确切元素,无论顺序如何。所以,如果我的2套是:

reflist = [1],[2,3,4],[5,6]
qlist = [1,2,3,4],[6,5]

匹配数应为1,即5,6

我尝试编写以下循环以匹配qlist中的元素与reflist,并计算匹配数:

i = 0
count = 0
for each in qlist:
    while i < len(qlist):
        if each.split(",").sort == reflist[i].split(",").sort:
            count = count + 1
        i = i + 1
print count

但是,即使qlist中的5和6的顺序是5,6,我也会继续计数= 0。真的很感激任何帮助!

4 个答案:

答案 0 :(得分:1)

这可以做到:

如果您没有重复项:

matches = [x for x in map(set, reflist) if x in map(set, qlist)]

如果您有重复项:

matches = [x for x in map(sorted, reflist) if x in map(sorted, qlist)]

答案 1 :(得分:1)

如果“套装”中没有重复项,请将“套装”转换为一组frozenset s,然后找到设置交叉点 -

i = set(map(frozenset, reflist))
j = map(frozenset, qlist)

len(i.intersection(j))
1

答案 2 :(得分:0)

您可以随时使用collections.Counter()

from collections import Counter

reflist = [[1],[2,3,4],[5,6]]
qlist = [[1,2,3,4],[6,5]]

result = [list(x.keys()) for x in [Counter(y) for y in reflist] if x in [Counter(y) for y in qlist]]

print(result)

哪个输出:

[[5,6]]

答案 3 :(得分:0)

这是我的单行,使用frozensetand

len(set(map(frozenset, qlist)) and set(map(frozenset, reflist)))

我知道你是Python的新手,因此我将使用你自己的方法回答你的问题,只是为了记录基本的简单答案以供将来参考。

首先,您的代码根本不应运行。它必须输出错误,因为eachreflist[i]都是列表,并且您正在对它们应用split(",")的字符串方法。因此,您获得的初始值为count = 0。您必须首先检查您的代码是否甚至触及qlistreflist的所有元素。这不是Code Review,因此我会留给你运行这个并看到答案:

i = 0
count = 0
for each in qlist:
    while i < len(qlist):
        print i
        print each
        print reflist[i]
        i = i + 1

请记住:您不必迭代索引!您可以直接遍历iterables的元素!这是您正在寻找的答案:

match = [] # Optional, to see all the matching elements
count = 0 
for q in qlist:
    for r in reflist:
        if set(q) == set(r):
            print q, r
            match.append(q)
            count += 1 
print match
print count, len(match)