簡體   English   中英

Pythonic方法將字符串列表轉換為字典,奇數索引字符串作為鍵,偶數索引字符串作為值?

[英]Pythonic way to turn a list of strings into a dictionary with the odd-indexed strings as keys and even-indexed ones as values?

我有一個從某處解析的字符串列表,格式如下:

[key1, value1, key2, value2, key3, value3, ...]

我想基於這個列表創建一個字典,如下所示:

{key1:value1, key2:value2, key3:value3, ...}

具有索引偏移的普通for循環可能會成功,但我想知道是否有Pythonic這樣做的方法。 列表理解似乎很有趣,但我似乎無法找到如何將它們應用於這個特定問題。

有任何想法嗎?

你可以試試:

dict(zip(l[::2], l[1::2]))

說明:我們將列表拆分為兩個列表,一個是偶數,一個是奇數元素,從第一個或第二個元素(即l[::2]l[1::2] l[::2]開始,從兩個步驟中取出它們l[1::2] )。 然后我們使用內置於兩個列表的zip到一個對列表中。 最后,我們調用dict從這些鍵值對創建一個字典。

這是~4n的時間和~4n的空間,包括最后的字典。 但它可能比循環更快,因為zipdict和切片操作符是用C語言編寫的。

顯示我最喜歡的python成語的好機會:

>>> S = [1,2,3,4,5,6]
>>> dict(zip(*[iter(S)]*2))
{1: 2, 3: 4, 5: 6}

這個棘手的行將兩個參數傳遞給zip() ,其中每個參數 S上的迭代器相同 zip()創建2項元組,每次從zip上拉過迭代器。 然后dict()將這些元組轉換為字典。

推斷:

S = [1,2,3,4,5,6]

I = iter(S)
dict(zip(I,I))
In [71]: alist=['key1', 'value1', 'key2', 'value2', 'key3', 'value3']

In [72]: dict(alist[i:i+2] for i in range(0,len(alist),2))
Out[72]: {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}

除了pavpanchekha的簡短而完美的解決方案之外,您還可以使用生成器表達式(列表推導只是一個生成器表達式,它被提供給列表構造函數 - 它實際上更強大且更通用)以獲得額外的好處:

dict((l[i], l[l+1]) for i in range(0, len(l)-1, 2))

除了非常酷和功能外,它也是一個更好的算法:除非dict的實現特別愚蠢(不太可能被認為是內置的),這將為每個大小的l消耗相同的內存量(即以常量運行)又稱O(1)空間),因為它一次處理一對,而不是首先創建一個全新的元組列表。

result = dict(grouper(2, L))

grouper是一個在列表中形成對的函數,它在itertools receipes中給出

def grouper(n, iterable, fillvalue=None):
    "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *args)

dict獲取(key,value)對的列表並從中生成一個dict。

你也可以寫result = dict(zip(*[iter(L)]*2))並混淆大多數讀者:-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM