如何计算仅在列表python中具有数字的值的数量?

时间:2018-01-23 14:49:05

标签: python list dictionary

data = ['ID:123 GE:m FN:Amir LN:Maleki MN:0400101010 EM:a@b.c ST:VIC',
' ID:b22 EM:b@d.c ST:VIC GE:F FN:Miniyi LN:Li MN:0430101210 MN:0432101215',
' ID:153 GE:m FN:John LN:Liu MN:040181010 ST:NSW EM:d@b.c']

我想知道如何计算只包含数字的ID数量。我是否需要将此列表转换为字典才能这样做,还是有更简单的方法?

感谢

4 个答案:

答案 0 :(得分:1)

正则表达式对我来说太过分了。以下是基于split的解决方案:

>>> data = ['ID:123 GE:m FN:Amir LN:Maleki MN:0400101010 EM:a@b.c ST:VIC',
... ' ID:b22 EM:b@d.c ST:VIC GE:F FN:Miniyi LN:Li MN:0430101210 MN:0432101215',
... ' ID:153 GE:m FN:John LN:Liu MN:040181010 ST:NSW EM:d@b.c']
>>> 
>>> data_split = [[i.split(':') for i in s.split()] for s in data]
>>> IDs = [v for s in data_split for k, v in s if k=='ID']
>>> sum(map(str.isdigit, IDs))
2

答案 1 :(得分:0)

每当您尝试查找某些内容的实例数时,您的基线就是使用正则表达式或正则表达式。

对于您的特定示例,您似乎可以使用正则表达式id:\d\d\d

re.findall会为您提供所有比赛 并len(re.findall)将为您提供匹配数

我遗漏了一个全面的解决方案,所以你可以尝试自己。正则表达式对于所有语言的模式匹配都很有用。如果您熟悉某些库或方法,可能会有更快/更简单的方法,但正则表达式始终是模式匹配的绝对方式。

答案 2 :(得分:0)

您可以使用正则表达式,例如,正则表达式\bID:\d+\b将匹配ID字段,后跟仅数字值,直到下一个字边界\b。只需过滤那些与正则表达式匹配的内容。

>>> [d for d in data if re.search(r"\bID:\d+\b", d)]
['ID:123 GE:m FN:Amir LN:Maleki MN:0400101010 EM:a@b.c ST:VIC',
 ' ID:153 GE:m FN:John LN:Liu MN:040181010 ST:NSW EM:d@b.c']

或者,如果您只想计算,可以使用sum

>>> sum(1 for d in data if re.search(r"\bID:\d+\b", d))
2

答案 3 :(得分:0)

如果您只想查看:

data = ['ID:123 GE:m FN:Amir LN:Maleki MN:0400101010 EM:a@b.c ST:VIC',
' ID:b22 EM:b@d.c ST:VIC GE:F FN:Miniyi LN:Li MN:0430101210 MN:0432101215',
' ID:153 GE:m FN:John LN:Liu MN:040181010 ST:NSW EM:d@b.c']

for i in data:
    print(i.split()[0].split(':')[1].isdigit())

输出:

True
False
True

如果您也想要这些ID:

print([i for i in data if i.split()[0].split(':')[1].isdigit()])

输出:

['ID:123 GE:m FN:Amir LN:Maleki MN:0400101010 EM:a@b.c ST:VIC', ' ID:153 GE:m FN:John LN:Liu MN:040181010 ST:NSW EM:d@b.c']