如何从两个字典创建一个列表?

4
我正在尝试向GAE数据存储中的模型写入三个字段:日期、整数、整数。
class fusSent(db.Model):
    """ Models a list of the follow-ups due and follow-ups sent """
    date_created = db.DateTimeProperty(auto_now_add=True)
    fu_date = db.DateProperty()
    fus_due = db.IntegerProperty()
    fus_sent = db.IntegerProperty()

这些数据来自两个不同的字典,它们具有匹配的键(日期)。请参见下面。

fus_d = {2013-01-01: 1, 2013-04-01: 1, 2013-02-01: 1, 2013-03-01: 1}
fus_s = {2013-01-01: 0, 2013-04-01: 0, 2013-02-01: 1, 2013-03-01: 1} 

我猜想需要将字典合并成列表(类似下面的示例)才能将其保存到数据存储中。但是,我不完全确定这是否是最好的方法。

fu_list = [(2013-01-01, 1, 0), (2013-04-01, 1, 0), (2013-02-01, 1, 1), (2013-03-01, 1, 1)]

fus_due和fus_sent只是真/假标志吗?请使用db.BooleanProperty()代替。 - Brent Washburne
3个回答

6

我希望fus_dfus_s字典中实际上包含日期,因为你的2013-01-01示例实际上是一个求值结果为2011的数学表达式。但以下内容应该可以正常工作。

s = set(fus_d.keys())
s.update(fus_s.keys())
fu_list = [(k, fus_d.get(k), fus_s.get(k)) for k in s]

编辑:同时在Python 2.7中,您可以直接从字典中使用viewkeys而不是使用set

fu_list = [(k, fus_d.get(k), fus_s.get(k)) for k in fus_d.viewkeys() | fus_s]

它们确实有日期。我只是为了方便而这样写的。谢谢。 - 655321

2

改进@cmd回答。

为了向数据库写入数据,您应该构建一个模型实例列表,并调用db.put将它们保存到数据库中,像这样:

fus_d = {'2013-01-01': 1, '2013-04-01': 1, '2013-02-01': 1, '2013-03-01': 1}
fus_s = {'2013-01-01': 0, '2013-04-01': 0, '2013-02-01': 1, '2013-03-01': 1}

s = set(fus_d.keys())
s.update(fus_s.keys())
fu_list = [fusSent(fu_date=k, fus_due=fus_d.get(k, 0), fus_sent=fus_s.get(k, 0)) for k in s]
db.put(fu_list)

@655321,虽然cmd的答案关于列表是正确的,但实际上这个答案是以一种高效的方式将值直接插入到数据存储中... - Lipis

1

@cmd有生成您请求的列表的代码,但这并不会将其存入数据存储区。以下代码将创建实体并保存它们:

s = set(fus_d.keys())
s.update(fus_s.keys())
for k in s:
    sent = fusSent(fu_date=k, fus_due=fus_d.get(k), fus_sent=fus_s.get(k))
    sent.put()

我同意,db.put(list) 更有效率。 - Brent Washburne

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