【问题标题】:In a dictionnary, how to check that a key has exactly 1 value?在字典中,如何检查一个键是否正好有 1 个值?
【发布时间】:2022-01-01 23:12:12
【问题描述】:

我有这个字典:

{128: ['S', 'S', 'O', 'F'], 512: ['S', 'F']}

我想确保每个键都有一个值“F”和一个值“S”,如果不是这样,则返回一条消息

我试过了,但它似乎没有用: 它没有打印消息

for key in d:
    if not re.search(r"[F]{1}","".join(d[key])) or not re.search(r"[S].{1}","".join(d[key])):
        print(f"There is no start or end stop for the line {key}.")

谢谢

【问题讨论】:

  • 它看起来不像一个正则表达式问题,您正在检查一个字符串是否等于某个值。此外,您的键是数字,没有字母。

标签: python string dictionary


【解决方案1】:

您可以使用计数器并同时获取所有字母的计数:

>>> from collections import Counter
>>> di={128: ['S', 'S', 'O', 'F'], 512: ['S', 'F']}
>>> {k:Counter(v) for k,v in di.items()}
{128: Counter({'S': 2, 'O': 1, 'F': 1}), 512: Counter({'S': 1, 'F': 1})}

【讨论】:

    【解决方案2】:

    您可以检查每个值中这些字符的计数。下面是一种方法

    sample = {128: ['S', 'S', 'O', 'F'], 512: ['S', 'F']}
    wrong_lines = [index for index, value in sample.items() if value.count('S') == value.count('F') == 1]
    print(f"Wrong lines {wrong_lines}")
    

    【讨论】:

    • 这段代码返回:错行[512],不是!
    • 返回错误列表的key!
    【解决方案3】:

    您的字典包含一个列表,而不是字符串,因此您不应使用正则表达式。您可以使用list.count(value) 检查列表是否包含您想要的值的数量。

    for key in d:
      if not (d[ḱey].count('F') == 1 and d[ḱey].count('S') == 1):
        print(f"There is no start or end stop for the line {key}.")
    

    【讨论】:

    • 'i' 在这里没有定义!
    • 我从提出问题的人那里获取了那部分代码
    • 问题已编辑,现在是key 而不是i。为避免混淆,您应该进行相同的更改。
    【解决方案4】:
    d = {128: ['S', 'S', 'O', 'F'], 512: ['S', 'F']}
    
    for key in d:
      if not (d[key].count('F') == 1 and d[key].count('S') == 1):
        print(f"There is no start or end stop for the line {key}.")
    

    【讨论】:

    • 这似乎与几天前发布的@riquefr's answer 中的代码完全相同,只是您包含的解释较少。请在提供新答案之前查看现有答案。很高兴您包含示例数据,但函数本身似乎是一个精确的副本。如果我遗漏了什么,其他人也会:在这种情况下,编辑您的答案以解释您的方法的不同之处。
    猜你喜欢
    • 1970-01-01
    • 2010-11-20
    • 1970-01-01
    • 2014-09-14
    • 2013-11-16
    • 2015-09-24
    • 2021-12-07
    • 2014-09-16
    相关资源
    最近更新 更多