检查我的dict / struct的一部分是否在列表中[python]

时间:2016-10-24 04:10:26

标签: python

我的清单如下:

list = [{'a', 'b', 1}, {'x', 'y', 2}]

我有我的变量,我只想匹配前2个字母。

aa = {'x', 'y', 2}
bb = {'x', 'z', 2}

因此,aa中的listTrue,但bb中的listFalse

我尝试在{'x', 'y', _}中使用list。但这有时会返回True,有时会返回False?这可能是因为字母不按顺序排列,因为当我打印list时,我看到这些字母实际上是随机顺序的?有什么帮助吗?

2 个答案:

答案 0 :(得分:2)

我很确定你的意思是处理列表或元组,而不是集合,所以你可以在这里使用itemgetter

from operator import itemgetter

first_two = itemgetter(0, 1)

l = [['a', 'b', 1], ['x', 'y', 2]]    # list of lists
aa = ['x', 'y', 2]
bb = ['x', 'z', 2]
cc = ('a', 'b', 100)

>>> first_two(aa) in (first_two(x) for x in l)
True
>>> first_two(bb) in (first_two(x) for x in l)
False
>>> first_two(cc) in (first_two(x) for x in l)
True

first_two是一个itemgetter,它将返回一个包含给定序列中相应元素的元组。这将使用生成器表达式应用于列表l中的每个项目,从而提取列表中每个项目的前两个元素。类似地,提取每个变量的前两个元素(aabb等)。然后比较生成的元组以获得布尔结果。

您可以将其概括为一个函数:

def part_in(value, sequence, getter=None):
    if getter is None:
        getter = itemgetter(*range(len(value)))    # compare on all items
    return getter(value) in (getter(x) for x in sequence if len(x) >= len(value))

>>> part_in(aa, l)
True
>>> part_in(aa, l, itemgetter(0, 1))
True
>>> part_in(aa, l, itemgetter(0, 2))    # considers first and third items only
True

最后一个例子表明,选择和比较项目的任何索引都很容易。

答案 1 :(得分:0)

使用功能:

def compare_sequences(main_sequence=None, compared_sequence=None, elements=2):
    for seq in main_sequence:
        if compared_sequence[:elements] == seq[:elements]:
            return True 
    return False

my_tuples = (('a', 'b', 1), ('x', 'y', 2))
aa = ('x', 'y', 2)
bb = ('x', 'z', 2)
print(compare_sequences(my_tuples, aa, 2))