python - 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']}]
解决方案
# 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']}]
如果你不喜欢多余的遍历列表,你可以改变替代方案。
- 对于 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)
- 当然,使用 for 语句而不是理解,你可以在 3.7 或更早的版本中做到这一点。
list2 = []
for d in list1:
text = ' '.join(d['codes'])
if 'Two' in text and 'One' not in text:
list2.append(d)
- 或者使用函数+理解:
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)
]
最后一个非常易读,但有人可能不喜欢声明只在一个地方使用的函数。
选择适合您情况的方法。
推荐阅读
- r - R中rbinom()的参数
- python - Python Pandas:如果没有数据则跳过然后继续写入excel
- reactjs - 反应模态组件接收相同的类
- python - 使用python从招聘广告中提取技能和职责等特征
- ios - 错误:仍在上传屏幕截图。关于 Apple App 提交
- sql - 计算相似子字符串 SQL 查询
- r - 在 R 中设置工作目录的最佳实践
- amazon-web-services - AWS Private API Gateway - 不是有效的键=值对(缺少等号)
- sql-server - SQL Server - 带有 string_agg 的索引视图
- r - 使用 read_table 读取 tidyverse 中带有引号的标题名称的文件