检查列表是否存在于没有循环的字典列表中

时间:2017-10-30 11:41:16

标签: python python-3.x list dictionary

如何检查列表是否作为列表成员(字典列表)中的值存在?

totalList = ([{'score': 1, 'item': ['text1', 'text2']},
              {'score': 2, 'item': ['text3', 'text4']},
              {'score': 3, 'item': ['text5', 'text6']}])
redList = ['text1', 'text2']

像这样的单行(虽然这个因为显而易见的原因不起作用)。我想避免循环。

if redList in totalList:
    print("True")

上下文:

redlists = a list of lists
totalList = []
for redlist in redlists:
   if redlist not in totalList:
      totalList.append(dictionary_item))

示例ditcionary_item = {'score': 1, 'item': ['text1', 'text2']}

注意:总列表不断增长,因为每次redList不在totalList中时,我会根据预定义的条件向toalList添加一个新的字典。

4 个答案:

答案 0 :(得分:2)

any(d['item'] == redList for d in totalList)

operator.itemgetter

redList in map(itemgetter('item'), totalList)

编辑:或者只是一个生成器表达式(类似于Leandro' s,但更节省空间,也许更节省时间,因为它在第一次发现时停止):

redList in (d['item'] for d in totalList)

答案 1 :(得分:1)

试试这个

if redList in [x.get('item') for x in totalList]:
    print("True")`

答案 2 :(得分:1)

如果您经常需要此检查,将列表转换为元组可能是值得的。这样,它们就会变为hashable,并且可以保存在set

totalList = [{'score': 1, 'item': ['text1', 'text2']},
             {'score': 2, 'item': ['text3', 'text4']},
             {'score': 3, 'item': ['text5', 'text6']}]

items = {tuple(d['item']) for d in totalList}
print(items)
# {('text3', 'text4'), ('text1', 'text2'), ('text5', 'text6')}
redList = ['text1', 'text2']
print(tuple(redList) in items)
# True

您只需要迭代一次即可创建该集合。每次检查都会很快,不需要任何循环。

如果你想获得相应的分数,你可以将元组保存在dict中:

scores = {tuple(d['item']):d['score'] for d in totalList}
print(scores)
# {('text1', 'text2'): 1, ('text3', 'text4'): 2, ('text5', 'text6'): 3}

print(scores.get(tuple(redList), 0))
# 1
print(scores.get(tuple(['a', 'b']), 0))
# 0

答案 3 :(得分:1)

您可以使用filter

redList = ['text1', 'text2']
totalList = ([{'score': 1, 'item': ['text1', 'text2']},
          {'score': 2, 'item': ['text3', 'text4']},
          {'score': 3, 'item': ['text5', 'text6']}])
if list(filter(lambda x:x["item"] == redList, totalList)):
    print('redList in totalList')