通过python调用SQL数据库,返回列表中配对字典中的输出:
[{'Something1A':Num1A}, {'Something1B':Num1B}, {'Something2A':Num2A} ...]
我想迭代这个列表,但同时拉两个词典。
我知道for obj1, obj2 in <list>
不是正确的方法,但那是什么?
答案 0 :(得分:2)
在这里使用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]
答案 1 :(得分:2)
你可以使用带有迭代器的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}
答案 2 :(得分:2)
>>> L = [{'1A': 1},{'1B': 1},{'2A': 2}, {'2B': 2}]
>>> zip(*[iter(L)]*2)
[({'1A': 1}, {'1B': 1}), ({'2A': 2}, {'2B': 2})]
答案 3 :(得分:1)
http://docs.python.org/2/library/itertools.html
寻找'石斑鱼',你会使用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)
答案 4 :(得分:1)
我相信在迭代中分组项目的Python习惯用法是
zip(*[iter(iterable)])*n)
其中 iterable 是您的词典列表,而 n 是2,如果您希望它们以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是'zipping'的两个序列是通过iter(data)
动态生成的,这意味着一次传递而不是三次传递(第一个切片为1,秒切片为1,zip为1)。
如果由于某种原因您的数据非常大,那么您可能不希望构建一个全新的元组列表,其中zip返回只是为了循环它一次。在这种情况下,您可以使用itertools.izip
代替zip
。
答案 5 :(得分: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()
已经是一个生成器
答案 6 :(得分:-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])