2017-06-22 170 views
0

問題:如何列出my_list列表高效pythonically轉換爲一個字典my_dict所以每一個嵌套列表是零個元素是關鍵,其餘元素是一個值(也是列表)。在Python,轉換列表,字典,使第n個元素是一個關鍵

例子:

輸入:

my_list = [['a', 'b'], 
      ['b', 'c', 'd', 'e', 'f'], 
      ['g'], 
      ['h', 'i', 'j'], 
      ['k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't']] 

輸出:

my_dict = {'a': ['b'], 
      'b': ['c', 'd', 'e', 'f'], 
      'g': None, 
      'h': ['i', 'j'], 
      'k': ['l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't']} 

旁註: 我的數據集是巨大的,因此方法必須是清潔,高效。雖然迭代列表是可以接受的,但我寧願避免嵌套循環(以保持O(n)的複雜性)。我設法編寫一個函數,通過迭代輸入列表來完成工作,並彈出第零個元素,但是使得整個解決方案O(n * n)成爲popping is itself O(n)

+2

如果什麼'mydict [I] [0]'有重複? – voidpro

+0

你的意思是'my_list'?在字典中,如果有一個鍵重複,它只是覆蓋舊的值。如果你的意思是'my_list',它不會有重複,我在腳本中檢查它。 – Artur

+1

是的。我的意思是'my_list [i] [0]'如果沒有重複,那麼下面的答案就可以在沒有任何數據中斷的情況下解決。 – voidpro

回答

7

使用詞典理解

dct = {lst[0]: lst[1:] or None for lst in my_list} 
pprint(dct) 

{'a': ['b'], 
'b': ['c', 'd', 'e', 'f'], 
'g': None, 
'h': ['i', 'j'], 
'k': ['l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't']} 

複雜:值列表或None由短路列表切片從指數一個與None使用or運營商創建

的複雜性這個字典。可比。是O(n * m),其中n是列表中的項目數量和m是最大片段的長度。這裏的收益並不是時間複雜度的降低,而是CPU時間。

+1

oops,看起來我在這裏稍微晚點,加上一個爲你的速度:) –

+0

或者解開'{a:b或None for a,* b in y_list}' –

+2

@Chris_Rands是的,但*擴展拆包*僅適用於Python 3. –

0

你可以做,

{ item[0]: item[1:] or None for item in my_list } 
2

您可以使用dict comprehension

>>> { i[0]:i[1:] or None for i in my_list} 
{'a': ['b'], 
'b': ['c', 'd', 'e', 'f'], 
'g': None, 
'h': ['i', 'j'], 
'k': ['l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't']} 
0

這提供了一個O(n)的解決方案。

my_list = [['a', 'b'], 
     ['b', 'c', 'd', 'e', 'f'], 
     ['g'], 
     ['h', 'i', 'j'], 
     ['k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't']] 
print(my_list) 
my_dict={} 
for x in my_list: 
    my_dict[x[0]]=x[1:] 
print(my_dict) 

但要記住,不應該有在鑰匙任何重複,如果您使用的元組

+0

沒有那是O(N * N),由x [1:] – farincz

+0

@fincinc引起,這也是我的擔心。 – Artur

+0

@farincz @Artur我認爲,切片需要'O(結束 ​​- 開始)'。所以,複雜程度取決於每個切片的大小。在這種情況下,鍵「a,b,g,h」幾乎可以忽略不計。所以,我提到了'O(n)和O(結束開始)'的最大值。糾正我,如果我錯了。 – voidpro

0

名單切片具有O(N)的複雜性,相同的。在給定的輸入數據結構下,恐怕你不能比O(N * N)好。

0

使用字典cmprh

{i[0]:i[1:] or None for i in my_list} 

輸出:

{'a': ['b'], 'h': ['i', 'j'], 'k': ['l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't'], 'b': ['c', 'd', 'e', 'f'], 'g': None} 
+0

爲什麼要投票? –

+0

任何人都可以解釋爲什麼反對投票? –

相關問題