列表和元素比较python

时间:2015-11-07 06:26:20

标签: python list comparison subset

list1 = ['A','B']
list2 = ['a','c']
list3 = ['x','y','z']
list4 = [['A','b','c'],['a','x'],['Y','Z'],['d','g']]

我想检查list(list1,list2,list3)的所有元素是否包含在另一个更大列表(list4)的列表中。

我希望比较不区分大小写。

可以肯定的是,list1和list2在list4中,但不在list3中。我该怎么办?

另一方面,我怎么知道列表是否是列表集合。

换句话说,如果我不是定义列表的人,我如何区分列表是否只是元素列表的集合。

3 个答案:

答案 0 :(得分:1)

第一项 - 您希望进行不区分大小写的匹配。最好的方法是将所有内容转换为一个案例(上部或下部)。因此,对于每个列表,运行

list1 = map(lambda x: x.lower(), list1)

这会将您的列表转换为小写。我们假设你已经做到了。

其次,对于两个“简单”列表(非嵌套)的比较,您可以简单地说

if set(list1) < set(list2):

比较list1是否为list2的子集。在您的示例中,它将是错误的。

最后,如果要检查列表是否嵌套:

if ( type(list4[0]) == list) :

在这种情况下,这是真的。然后,只需迭代list4的元素并进行上面的集合比较。

答案 1 :(得分:1)

您可以使用lower()将所有列表的所有元素设置为小写,以实现不区分大小写。

def make_case_insensitive(lst):
    return [i.lower() for i in lst]

例如,

list1=make_case_insensitive(list1)

因为,更大的列表略有不同(包含列表作为元素),你必须稍微改变功能。

def make_bigger_list_caseinsensitive(bigger_list):
    return [[i.lower() for i in element] for element in bigger_list]

list4=make_bigger_list_caseinsensitive(list4)

检查较大列表中的任何元素是否是较小集合的超集。如果条件满意,打印列表更大,否则打印不在biggger列表中。首先从set生成list

print "Is in bigger list" if any(set(element).issuperset(set(list1)) for element in list4) else "not in biggger list"

要以稍高的可读性写它,请执行:

if any(set(element).issuperset(set(list1)) for element in list4):
    print "Is in bigger list"
else:
    print "not in biggger list"

最后,检查更大列表中是否存在嵌套列表:

print any(type(element)==list for element in list4)

答案 2 :(得分:0)

使用set是个好方法。

list1 = ['A','B']
list2 = ['a','c']
list3 = ['x','y','z']
list4 = [['A','b','c'],['a','x'],['Y','Z'],['d','g']]

set1 = set(map(lambda s: s.lower(), list1))
set2 = set(map(lambda s: s.lower(), list2))
set3 = set(map(lambda s: s.lower(), list3))
set4 = map(lambda l: set(map(lambda s: s.lower(), l)), list4)

print(set1) # set(['a', 'b'])
print(set2) # set(['a', 'c'])
print(set3) # set(['y', 'x', 'z'])
print(set4) # [set(['a', 'c', 'b']), set(['a', 'x']), set(['y', 'z']), set(['d', 'g'])]

lor = lambda x, y: x or y

reduce(lor, map(lambda s: set1.issubset(s), set4)) # True
reduce(lor, map(lambda s: set2.issubset(s), set4)) # True
reduce(lor, map(lambda s: set3.issubset(s), set4)) # False
  • 要进行不区分大小写的字符串比较,请将两个字符串转换为小写或大写。
  • 要测试list1中的所有元素都包含在list4中,请使用set.issubset