0

通过 python 调用 SQL db,返回列表中成对字典的输出:

[{'Something1A':Num1A}, {'Something1B':Num1B}, {'Something2A':Num2A} ...]

我想遍历这个列表,但同时拉两个字典。

我知道这for obj1, obj2 in <list>不是正确的方法,但什么是正确的?

4

7 回答 7

6

您可以在列表上使用带有迭代器的 zip 来执行此操作:

>>> dicts = [{'1A': 1}, {'1B': 2}, {'2A': 3}, {'2B': 4}]
>>> for obj1, obj2 in zip(*[iter(dicts)]*2):
    print obj1, obj2


{'1A': 1} {'1B': 2}
{'2A': 3} {'2B': 4}
于 2013-07-21T19:59:09.747 回答
3

在这里使用zip()

>>> testList = [{'2': 2}, {'3':3}, {'4':4}, {'5':5}]
>>> for i, j in zip(testList[::2], testList[1::2]):
        print i, j


{'2': 2} {'3': 3}
{'4': 4} {'5': 5}

替代方案(不使用zip()):

for elem in range(0, len(testList), 2):
    firstDict, secondDict = testList[i], testList[i+1]
于 2013-07-21T19:46:32.207 回答
2

我相信用于对可迭代项进行分组的 Python 习语是

zip(*[iter(iterable)])*n)

iterable是您的字典列表,如果您希望它们以 2 个为一组,则n为 2。

解决方案将如下所示。

>>> data = [{'A':1}, {'B':2}, {'C':3}, {'D':4}]
>>> for dict1, dict2, in zip(*[iter(data)]*2):
    print dict1, dict2


{'A': 1} {'B': 2}
{'C': 3} {'D': 4}
>>> 

这不依赖于切片,这意味着它的内存效率更高并且可能更快,因为在这种情况下 zip 正在“压缩”的两个序列是通过动态生成的iter(data),这意味着一次通过而不是三次通过(第一次是 1切片,1 秒切片,1 拉链)。

如果由于某种原因您的数据非常大,那么您可能不想构建一个全新的元组列表,该列表 zip 返回只是为了循环一次。在这种情况下,您可以使用itertools.izip.zip

于 2013-07-21T21:41:48.233 回答
2
>>> L = [{'1A': 1},{'1B': 1},{'2A': 2}, {'2B': 2}]
>>> zip(*[iter(L)]*2)
[({'1A': 1}, {'1B': 1}), ({'2A': 2}, {'2B': 2})]
于 2013-07-21T19:59:27.490 回答
1

http://docs.python.org/2/library/itertools.html

寻找'grouper',你会使用n=2。

import itertools
def grouper(iterable, n, fillvalue=None):
    "Collect data into fixed-length chunks or blocks"
    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx
    args = [iter(iterable)] * n
    return itertools.izip_longest(fillvalue=fillvalue, *args)
于 2013-07-21T19:50:23.247 回答
0

简单地

在 Python 2 中

li = [{'Something1A':10}, {'Something1B':201}, {'Something2A':405} ]
from itertools import imap
for a,b in imap(lambda x: x.items()[0], li):
    print a,b

在 Python 3 中,map()已经是一个生成器

于 2013-07-21T22:18:04.407 回答
-1

使用 index 从列表中获取两个元素。

testList = [{'2': 2}, {'3':3}, {'4':4}, {'5':5}]
for i in range(0,len(testList),2):
    print(testList[i],testList[i+1])
于 2013-07-21T19:49:18.373 回答