Python 基于匹配的dict键创建(k,v1,…,vn)元组

Python 基于匹配的dict键创建(k,v1,…,vn)元组,python,Python,我使用的是Python2.6,我有两个数据集,每个数据集都是字典列表。这两个数据集如下所示: [{'foo': 3}, {'bar': 4}] [{'bar': 1}, {'foo': 8}] 从这两个数据集中,我想创建一个元组列表,输入数据如下: [('foo', 3, 8), ('bar', 4, 1)] 顺便说一句,第一个数据集中的数字在结果元组中排在第一位是很重要的 实际上,我已经通过各种方式(包括嵌套列表理解)完成了这一点,但它似乎应该更简单/更清晰。我感到惊讶的是,itertoo

我使用的是Python2.6,我有两个数据集,每个数据集都是字典列表。这两个数据集如下所示:

[{'foo': 3}, {'bar': 4}]
[{'bar': 1}, {'foo': 8}]
从这两个数据集中,我想创建一个元组列表,输入数据如下:

[('foo', 3, 8), ('bar', 4, 1)]
顺便说一句,第一个数据集中的数字在结果元组中排在第一位是很重要的


实际上,我已经通过各种方式(包括嵌套列表理解)完成了这一点,但它似乎应该更简单/更清晰。我感到惊讶的是,itertools中的任何东西都没有跳出来(尽管我确实做了一个实现w/chain,结果得到了一个2元组,其中int在一个列表中)。有人能提供一个干净的解决方案吗,还是根本就没有

您可以使用
defaultdict

from collections import defaultdict

datasets = [{'foo': 3}, {'bar': 4}], [{'bar': 1}, {'foo': 8}]    

result = defaultdict(list)

for dataset in datasets:
    for eachdict in dataset:
        for key, value in eachdict.iteritems():
            result[key].append(value)

# the nested loops as a one-liner (utterly unnecessary):
# any(result[key].append(value) for dataset in datasets 
#                               for eachdict in dataset 
#                               for key, value in eachdict.iteritems())


# if you really need your output in exactly that format:
# result = [(key,) + tuple(values) for key, values in result.iteritems()]
print result

对我来说,这似乎是最干净的方法。

您可以使用
defaultdict

from collections import defaultdict

datasets = [{'foo': 3}, {'bar': 4}], [{'bar': 1}, {'foo': 8}]    

result = defaultdict(list)

for dataset in datasets:
    for eachdict in dataset:
        for key, value in eachdict.iteritems():
            result[key].append(value)

# the nested loops as a one-liner (utterly unnecessary):
# any(result[key].append(value) for dataset in datasets 
#                               for eachdict in dataset 
#                               for key, value in eachdict.iteritems())


# if you really need your output in exactly that format:
# result = [(key,) + tuple(values) for key, values in result.iteritems()]
print result
对我来说,这似乎是最干净的方法。

这是一种新方法,我们有一个工具可以做到这一点:

>>> ds1 = [{'foo': 3}, {'bar': 4}]
>>> ds2 = [{'bar': 1}, {'foo': 8}]

>>> import sqlite3
>>> c = sqlite3.connect(':memory:')
>>> c.execute('CREATE TABLE ds1 (key text PRIMARY KEY, value text)')
>>> c.execute('CREATE TABLE ds2 (key text PRIMARY KEY, value text)')
>>> c.executemany('INSERT INTO ds1 VALUES (?, ?)', [d.items()[0] for d in ds1])
>>> c.executemany('INSERT INTO ds2 VALUES (?, ?)', [d.items()[0] for d in ds2])
>>> c.commit()
>>> r = c.execute('SELECT ds1.key, ds1.value, ds2.value FROM ds1 INNER JOIN ds2 ON ds1.key=ds2.key')
>>> list(r)
[(u'foo', u'3', u'8'), (u'bar', u'4', u'1')]
随Python提供,不需要创建和维护实际的数据库来对数据集执行SQL查询。因此,如果您没有从数据库获取数据,并且无法更改查询以使其以最适合您的应用程序的形式返回,那么您仍然可以使用SQL对数据进行处理,这非常方便

使用SQL方法有几个优点1)代码清楚地表达了它的意图(我加入了两个数据集上的一个公共密钥),2)它使得更容易考虑正确性问题(例如在一个数据集中存在的密钥而不是另一个数据集,3),它易于扩展到多个字段或切换到多字段密钥,4)可以指定订购。

这是一个,我们有一个工具可以做到这一点:

>>> ds1 = [{'foo': 3}, {'bar': 4}]
>>> ds2 = [{'bar': 1}, {'foo': 8}]

>>> import sqlite3
>>> c = sqlite3.connect(':memory:')
>>> c.execute('CREATE TABLE ds1 (key text PRIMARY KEY, value text)')
>>> c.execute('CREATE TABLE ds2 (key text PRIMARY KEY, value text)')
>>> c.executemany('INSERT INTO ds1 VALUES (?, ?)', [d.items()[0] for d in ds1])
>>> c.executemany('INSERT INTO ds2 VALUES (?, ?)', [d.items()[0] for d in ds2])
>>> c.commit()
>>> r = c.execute('SELECT ds1.key, ds1.value, ds2.value FROM ds1 INNER JOIN ds2 ON ds1.key=ds2.key')
>>> list(r)
[(u'foo', u'3', u'8'), (u'bar', u'4', u'1')]
随Python提供,不需要创建和维护实际的数据库来对数据集执行SQL查询。因此,如果您没有从数据库获取数据,并且无法更改查询以使其以最适合您的应用程序的形式返回,那么您仍然可以使用SQL对数据进行处理,这非常方便


使用SQL方法有几个优点1)代码清楚地表达了它的意图(我加入了两个数据集上的一个公共密钥),2)它使得更容易考虑正确性问题(例如在一个数据集中存在的密钥而不是另一个数据集,3),它易于扩展到多个字段或切换到多字段密钥,4)可以指定顺序。

原始问题与sqlite或数据库无关。@jonesy是这样吗?这并不意味着你不能用数据库来解决它。输出仍然是您想要的数据。不可否认,除非有显著的性能优势,否则我更喜欢用Python实现。最初的问题也与defaultdicts无关。实际上,您所做的是一个内部联接操作。你用来解决这个问题的工具。这篇文章的要点是,当人们可以使用已经优化过的工具时,他们经常使用字典来重新设计常见的数据库操作。@RaymondHettinger-我错误地将答案解释为假设我是从数据库中获取数据的,因此应该更改查询,以更合适的形式获取数据。我编辑了答案,试图否定我的-1,但没有用。我想你必须编辑它。我错了,谢谢你们。这篇文章可能反映了我们的工具集偏见。有点讽刺的是,使用数据库工具进行基本的数据库操作被认为是聪明的,而使用字典重新创建数据库则被认为是简单、直接的方法最初的问题与sqlite或数据库没有任何关系。@jonesy:是吗?这并不意味着你不能用数据库来解决它。输出仍然是您想要的数据。不可否认,除非有显著的性能优势,否则我更喜欢用Python实现。最初的问题也与defaultdicts无关。实际上,您所做的是一个内部联接操作。你用来解决这个问题的工具。这篇文章的要点是,当人们可以使用已经优化过的工具时,他们经常使用字典来重新设计常见的数据库操作。@RaymondHettinger-我错误地将答案解释为假设我是从数据库中获取数据的,因此应该更改查询,以更合适的形式获取数据。我编辑了答案,试图否定我的-1,但没有用。我想你必须编辑它。我错了,谢谢你们。这篇文章可能反映了我们的工具集偏见。有点讽刺的是,使用数据库工具进行基本的数据库操作被认为是聪明的,而使用字典重新创建数据库则被认为是简单、直接的方法这几乎正是我已经决定要做的,但我想我会寻求其他的意见。感谢您验证我的想法:)这几乎正是我已经决定要做的,但我想我会寻求其他的意见。感谢您验证我的想法:)