假设我有两个词组列表:
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”解决方案?
答案 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 字典反映了我想要的想法。