繁体   English   中英

根据公共密钥与字典列表相交

[英]Intersect a list of dicts based on a common key

假设我有两个字典:

dates = [{'created':'2010-12-01'},{'created':'2010-12-02'},....]
elts = [{'created':'2010-12-01', 'key1':'val1', 'key2':'val2'}, {'created':'2010-12-05','key1':'val1'}]

日期列表是一堆连续的日期。

elts列表可以是1到len(dates)之间的任意值,而我想做的基本上是填充elts,以便无论是否有其他键,它都有一个日期的字典。

这是我天真的解决方案:

for d in dates:
    for e in elts:
        if d['created'] == e['created']:
            d.update(dict(key1=e['key1']))

因此,我将得到一个最终array d ,每个dict中都带有所有日期,但是可能/可能没有其他键/值。

什么是好的“ pythonic”解决方案?

我认为您的问题有些悬而未决,因为您的解决方案似乎并未真正解决您的问题,但是如果您想在elts为尚未出现在elts中的dates中的每个日期创建一个条目,则可以使用此方法:

all_dates = set(e['created'] for e in dates) # gets a list of all dates that exist in `dates`
elts_dates = set(e['created'] for e in elts) # same for elts

missing_dates = all_dates - elts_dates

for entry in missing_dates:
    elts.append(dict(created=entry))

这是一个http://codepad.org片段,显示了该片段的效果: http : //codepad.org/n4NbjvPM

编辑:不同的解决方案:

设定一组您已经拥有的日期:

dates_in_elts = set(e['created'] for e in elts)

for d in dates:
    if d['created'] not in dates_in_elts:
        e.append(d)

这只会对每个列表进行一次迭代,而不是对日期中的每个日期进行迭代。

我可能会改用那些列表字典。

  dates_d = dict([(x['created'], x) for x in dates])
  elts_d = dict([(x['created'], x) for x in elts])
  dates_d.update(elts_d)

如果您随后需要将其重新排列为字典列表,则可以轻松做到这一点:

  dates = [dates_d[x] for x in sorted(dates_d)]

但是,如果您除了合并以外没有做其他事情,您的解决方案可能更容易阅读。 但我怀疑,在这种情况下,字典列表并不是一种非常方便的数据格式。

也许我读错了,但在我看来,代码的最终结果是,对于elts中的每个字典,您真的只想从elts复制该字典以覆盖日期中的相应字典。

>>> for d in dates:
...    for e in elts:
...       if d['created'] == e['created']:
...          d.update(e)

那时,正是日期字典反映了我认为您想要的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM