从列表中选择与特定条件匹配的项目

时间:2014-07-30 21:11:23

标签: python dictionary

我有一个包含这样的键的词典:

237870a/
237870b/
237870c/
115460a/
115460b/
115460c/
115460d/
229898/
212365a/
109678/

我需要迭代这个键列表并提取某些项目:

  1. 对于共享相同数字前缀且末尾有字母字符的项目,我需要具有最高字符的项目,即在这种情况下237870c115460d和{ {1}}。

  2. 任何其他具有唯一编号且没有尾随字母字符的项目,即212365a& 229898

  3. 所以,我的结果应该是:

    109678
    抱歉,我没有任何代码可以显示,因为我真的不确定如何开始写这个...

1 个答案:

答案 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/']