2013-07-21 109 views
0

必須通過蟒到SQL數據庫的調用一個列表中返回配對詞典輸出:蟒蛇:在列表中通過兩個對象重複一次

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

我想通過這個列表進行迭代,但彈出兩個字典在同一時間。

我知道for obj1, obj2 in <list>不是正確的做法,但是什麼?

回答

2

爲此,您可以用拉鍊超過列表中的迭代器:

>>> 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} 
+0

這工作就像一個魅力 – fox

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] 
+0

列表分片,使一個全新的列表。這將會佔用額外的空間。更好地使用索引。檢查我的代碼。 – rnbcoder

+2

您的代碼打印出'({'2':2},{'3':3})\ n({'3':3},{'4':4})',您需要將其更改爲'我在範圍內(0,len(testList),2):print(testList [i],testList [i + 1])' –

+0

oops!我猜是時候小睡一會了! :D你可能想取消你的投票。 – rnbcoder

-1

使用索引來從列表中的兩個元素。

testList = [{'2': 2}, {'3':3}, {'4':4}, {'5':5}] 
for i in range(0,len(testList),2): 
    print(testList[i],testList[i+1]) 
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) 
+1

我很確定他想要(1A,1B),(2A,2B)等,而不是(1A,1B),(1B,2A)等。 – user2357112

+0

啊,是的。謝謝。固定。 – AdamKG

2
>>> L = [{'1A': 1},{'1B': 1},{'2A': 2}, {'2B': 2}] 
>>> zip(*[iter(L)]*2) 
[({'1A': 1}, {'1B': 1}), ({'2A': 2}, {'2B': 2})] 
1

我相信在迭代分組項目Python的成語是

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

其中可迭代是您的dictio列表naries和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} 
>>> 

這不依賴於切片這意味着它的更多的存儲器效率和可能的速度更快以及由於兩個序列,其拉鍊是「壓縮和解」在這種情況下被經由iter(data)實時生成的,這意味着一個通而不是三遍(1表示第一片,1表示秒片,1表示zip)。

如果由於某種原因,您的數據非常大,那麼您可能不希望構造一個全新的zip返回列表,以便循環一次。在這種情況下,您可以使用itertools.izip來代替zip

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()已經是一個發電機