如何计算列表中只有数字的值的数量?

2024-10-02 22:35:11 发布

您现在位置:Python中文网/ 问答频道 /正文

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。我需要把这个列表转换成字典吗?还是有更简单的方法?你知道吗

谢谢


Tags: iddatalijohnfnstemln
3条回答

我觉得正则表达式有点过分了。以下是基于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

您可以使用正则表达式,例如regex \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

每当您试图查找某个对象的实例数时,您的基准就是使用正则表达式或regex。你知道吗

对于您的特定示例,似乎可以使用regex id:\d\d\d

re.findall将获得所有匹配项 而且len(re.findall)会得到匹配的数量

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

相关问题 更多 >