首页 > 解决方案 > Python检查字典中的列表是否满足两个条件

问题描述

给定下面的 list1,我如何返回一个新列表,其中“codes”的值包含字符串“Two”但不包含字符串“One”?

# Example, given list1:
list1 = [{'id': 11, 'codes': ['OneSeven', 'TwoThree']}, {'id': 22, 'codes': ['FiveTwoSix', 'Four', 'FourFive']}, {'id': 33, 'codes': ['SixSeven', 'OneSix']}]

# Return list with element where 'id': 22 since the string 'Two' is in codes but 'One' isn't.
list2 = [{'id': 22, 'codes': ['FiveTwoSix', 'Four', 'FourFive']}]

标签: python

解决方案


# Example, given list1:
list1 = [{'id': 11, 'codes': ['OneSeven', 'TwoThree']}, {'id': 22, 'codes': ['FiveTwoSix', 'Four', 'FourFive']}, {'id': 33, 'codes': ['SixSeven', 'OneSix']}]

list2 = [
    d for d in list1
    if any(
        'Two' in word
        for word in d['codes']
    ) and all(
        'One' not in word
        for word in d['codes']
    )
]

print(list2)

输出:

[{'id': 22, 'codes': ['FiveTwoSix', 'Four', 'FourFive']}]

如果你不喜欢多余的遍历列表,你可以改变替代方案。

  1. 对于 python 3.8 或更高版本,您可以这样做:

# Example, given list1:
list1 = [{'id': 11, 'codes': ['OneSeven', 'TwoThree']}, {'id': 22, 'codes': ['FiveTwoSix', 'Four', 'FourFive']}, {'id': 33, 'codes': ['SixSeven', 'OneSix']}]

list2 = [
    d for d in list1
    if 'Two' in (text := ' '.join(d['codes'])) and 'One' not in text
]

print(list2)
  1. 当然,使用 for 语句而不是理解,你可以在 3.7 或更早的版本中做到这一点。
list2 = []
for d in list1:
    text = ' '.join(d['codes'])
    if 'Two' in text and 'One' not in text:
        list2.append(d)
  1. 或者使用函数+理解:
def check_condition(data: dict) -> bool:
    text = ' '.join(data['codes'])
    return'Two' in text and 'One' not in text

list2 = [
    d for d in list1 if check_condition(d)
]

最后一个非常易读,但有人可能不喜欢声明只在一个地方使用的函数。
选择适合您情况的方法。


推荐阅读