我有两个名单说
List1 = ['a','c','c']
List2 = ['x','b','a','x','c','y','c']
Run Code Online (Sandbox Code Playgroud)
现在我想知道List2中是否存在List1的所有元素.在这种情况下,所有的都有.我不能使用子集函数,因为我可以在列表中重复元素.我可以使用for循环来计算List1中每个项目的出现次数,并查看它是否小于或等于List2中出现的次数.有一个更好的方法吗?
谢谢.
pok*_*oke 31
当出现次数无关紧要时,您仍然可以通过动态创建集合来使用子集功能:
>>> list1 = ['a', 'c', 'c']
>>> list2 = ['x', 'b', 'a', 'x', 'c', 'y', 'c']
>>> set(list1) < set(list2)
True
Run Code Online (Sandbox Code Playgroud)
如果需要检查每个元素在第二个列表中是否至少与第一个列表中显示的次数相同,则可以使用Counter类型并定义自己的子集关系:
>>> from collections import Counter
>>> def counterSubset(list1, list2):
c1, c2 = Counter(list1), Counter(list2)
for k, n in c1.items():
if n > c2[k]:
return False
return True
>>> counterSubset(list1, list2)
True
>>> counterSubset(list1 + ['a'], list2)
False
>>> counterSubset(list1 + ['z'], list2)
False
Run Code Online (Sandbox Code Playgroud)
如果您已经有计数器(这可能是存储数据的有用替代方法),您也可以将其写为一行:
>>> all(n <= c2[k] for k, n in c1.items())
True
Run Code Online (Sandbox Code Playgroud)
请注意以下事项:
>>>listA = ['a', 'a', 'b','b','b','c']
>>>listB = ['b', 'a','a','b','c','d']
>>>all(item in listB for item in listA)
True
Run Code Online (Sandbox Code Playgroud)
如果您像在英语中一样阅读“all”行,这并没有错,但可能会产生误导,因为 listA 有第三个 'b' 而 listB 没有。
这也有同样的问题:
def list1InList2(list1, list2):
for item in list1:
if item not in list2:
return False
return True
Run Code Online (Sandbox Code Playgroud)
只是一个注释。以下不起作用:
>>>tupA = (1,2,3,4,5,6,7,8,9)
>>>tupB = (1,2,3,4,5,6,6,7,8,9)
>>>set(tupA) < set(TupB)
False
Run Code Online (Sandbox Code Playgroud)
如果将元组转换为列表,它仍然不起作用。我不知道为什么字符串可以工作,但整数不行。
有效,但有相同的问题,即不记录元素出现次数:
>>>set(tupA).issubset(set(tupB))
True
Run Code Online (Sandbox Code Playgroud)
使用集合不是多出现元素匹配的综合解决方案。
但这是一个单行解决方案/适应shantanoo的答案,无需尝试/除外:
all(True if sequenceA.count(item) <= sequenceB.count(item) else False for item in sequenceA)
Run Code Online (Sandbox Code Playgroud)
使用三元条件运算符包装列表推导式的内置函数。蟒蛇真棒!请注意,“<=”不应为“==”。
使用此解决方案,序列 A 和 B 可以使用“计数”方法键入元组和列表以及其他“序列”。两个序列中的元素都可以是大多数类型。我不会像现在这样将它与 dicts 一起使用,因此使用“序列”而不是“可迭代”。
| 归档时间: |
|
| 查看次数: |
25697 次 |
| 最近记录: |