我有一个包含这样的键的词典:
237870a/
237870b/
237870c/
115460a/
115460b/
115460c/
115460d/
229898/
212365a/
109678/
我需要迭代这个键列表并提取某些项目:
对于共享相同数字前缀且末尾有字母字符的项目,我需要具有最高字符的项目,即在这种情况下237870c
,115460d
和{ {1}}。
任何其他具有唯一编号且没有尾随字母字符的项目,即212365a
& 229898
所以,我的结果应该是:
109678
抱歉,我没有任何代码可以显示,因为我真的不确定如何开始写这个...
答案 0 :(得分:2)
首先,这与字典无关:正如你自己所说,你正在按键列表操作。列表的来源并不重要。
您可以使用itertools.groupby
来使用聪明的按键功能。要使itertools.groupby
正常工作,我们首先需要对键进行排序:
keys = sorted(keys)
然后我们必须考虑一个关键功能。必须以某种方式设计,以便只使用数字前缀进行分组:
def keyfunc(item):
if item[-1].isalpha():
return item[:-1]
return item
这将删除最后一个字符(如果它是字母),以便itertools.groupby
在分组时不会考虑它。然后,我们将获取分组项目的最后一个元素,即具有最高字母字符的元素。
现在我们可以应用groupby来获取您需要的项目列表:
items = [sorted(subitems)[-1]
for _, subitems
in itertools.groupby(keys, keyfunc)]
看到它的实际效果:
>>> # output formatting and indentation by me
...
>>> keys
['237870a/', '237870b/', '237870c/', '115460a/',
'115460b/', '115460c/', '115460d/', '229898/',
'212365a/', '109678/']
>>> def keyfunc(item):
... if item[-1].isalpha():
... return item[:-1]
... return item
...
>>> items = [sorted(subitems)[-1]
... for _, subitems
... in itertools.groupby(keys, keyfunc)]
>>> items
['237870c/', '115460d/', '229898/', '212365a/', '109678/']