我是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。真的很感激任何帮助!
答案 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)
这是我的单行,使用frozenset
和and
:
len(set(map(frozenset, qlist)) and set(map(frozenset, reflist)))
我知道你是Python的新手,因此我将使用你自己的方法回答你的问题,只是为了记录基本的简单答案以供将来参考。
首先,您的代码根本不应运行。它必须输出错误,因为each
和reflist[i]
都是列表,并且您正在对它们应用split(",")
的字符串方法。因此,您获得的初始值为count = 0
。您必须首先检查您的代码是否甚至触及qlist
和reflist
的所有元素。这不是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)