如何按给定键匹配值过滤字典列表

9

使用类似 a = copyf(dictlist, key, valuelist) 的接口。

>>> dictlist = [{'first': 'James',
                 'last': 'Joule'},
                {'first': 'James',
                 'last': 'Watt'},
                {'first': 'Christian',
                 'last': 'Doppler'}]
>>> valuelist = ['James', 'John']
>>> x = copyf(dictlist, 'first', valuelist)
>>> print(x)
[{'first': 'James',
  'last': 'Joule'},
 {'first': 'James',
  'last': 'Watt'}]

dictlist 实际上是一个 csv.DictReader 实例。

5个回答

14

更新:考虑到提问者的重新编辑问题:

def copyf(dictlist, key, valuelist):
      return [dictio for dictio in dictlist if dictio[key] in valuelist]

6

可能不是最佳解决方案,但我们还是试一试:

>>> def copyf(data, key, allowed):
...     return filter(lambda x: key in x and x[key] in allowed, data)
... 
>>> dictlist = [{'first': 'James', 'last': 'Joule'}, {'first': 'James','last': 'Watt'},{'first': 'Christian','last': 'Doppler'}]
>>> copyf(dictlist, 'first', ('Christian',))
[{'last': 'Doppler', 'first': 'Christian'}]
>>> copyf(dictlist, 'last', ('Christian',))
[]
>>> copyf(dictlist, 'first', ('James',))
[{'last': 'Joule', 'first': 'James'}, {'last': 'Watt', 'first': 'James'}]
>>> 

@plaes,你可以通过去掉方括号将列表推导式转换为生成器表达式。这与你使用iteritems()的目的是一致的,即避免创建中间列表。 - kevpie
@kevpie:谢谢,我会修复的 \o/ - plaes
@plaes,可能OP是想按值而不是按键进行过滤。请注意给定的函数参数(字典、键、值列表)。 - joaquin
@joaquin:现在我再看一遍,可能是那样的。:S - plaes
抱歉造成歧义,我提供了一个使用示例。 - Christopher O'Donnell

2

类似于:

new_dict = dict((k, v) for k,v in old_dict.items() if v in allowed_values)

?


你正在独立地删除所有重复的值,而不考虑键。OP的问题说“从列表中匹配值(对于给定的键)”,并实际上将'key'作为函数参数。也许他改变了主意...或者我误解了? - joaquin
在字典中,每个给定的键只能有0或1个值。这种情况让我分心了,忽略了你加粗的那句话。抱歉! :) - 9000
好的,你得到了“被接受的答案”。希望这不是因为作业而获得的 :-)) - joaquin
接受的答案有时会改变。统计数据表明,即使问题已经有一个低分的被接受答案(比如我在这里),给出一个更好的答案仍然是值得的。请注意,现在采用相同方法的更完整的答案得分提高了两倍。 - 9000
抱歉各位,我在发布问题并接受答案时非常疲惫。这个答案没有考虑“给定键”的情况。 - Christopher O'Donnell
完全没问题。正确的答案应该被接受,而错误的答案,无论得到多少赞同,也不应该被接受。 - 9000

1
干净整洁,使用 filterlambda
>>> def copyf(dictlist, key, valuelist):
...     filter(lambda d: d[key] in valuelist, dictlist)

0

我更喜欢

filter(lambda d: value in d[key], dictlist)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接