根据公共密钥交叉dicts列表

时间:2011-01-03 22:24:40

标签: python list intersection

假设我有两个词组列表:

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(日期)之间的任何位置,我想要做的就是使用pad elts,这样它就有一个日期的dict,无论是否还有其他键。

这是我天真的解决方案:

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

因此,我将在每个array d中设置一个包含所有日期的最终dict,但可能/可能没有其他键/值。

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

4 个答案:

答案 0 :(得分:3)

我认为你的问题有点过了,因为你的解决方案似乎并没有真正解决你的问题,但如果你想在elts中为dates中的每个日期创建一个条目还没有出现在elts中,你可以使用它:

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

答案 1 :(得分:2)

编辑:不同的解决方案:

制作一套你已经拥有的日期:

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)

这只迭代每个列表一次,而不是为日期中的每个日期迭代elts。

答案 2 :(得分:1)

我可能会改为使用这些列表字典。

  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)]

如果您没有做任何其他事情而不是合并它们,那么您的解决方案可能更容易阅读。但我怀疑,在这种情况下,词典列表不是一种非常方便的数据格式。

答案 3 :(得分:0)

也许我误读了,但在我看来,你的代码的最终结果是,对于elts中的每个dict,你真的只想从elts复制那个dict来覆盖日期中相应的dict。

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

此时, date 字典反映了我想要的想法