2015-10-13 48 views
3

一個字典我有一個列表my_list = ['a', 'b', 'c', 'd'],我需要創建一個字典,它看起來像獲得從Python列表

{ 'a': ['a', 'b', 'c', 'd'], 
    'b': ['b', 'a', 'c', 'd'], 
    'c': ['c', 'a', 'b', 'd'], 
    'd': ['d', 'a', 'b', 'c'] } 

每個元素作爲它的值是列表中,但第一個元素就是它本身。

這裏是我的代碼

my_list = ['1', '2', '3', '4'] 
my_dict=dict() 

for x in my_list:   
    n = my_lst[:] 
    n.remove(x) 
    n= [x] + n[:] 
    my_dict[x] = n 

print my_dict 

根據需要賦予

{'1': ['1', '2', '3', '4'], 
'3': ['3', '1', '2', '4'], 
'2': ['2', '1', '3', '4'], 
'4': ['4', '1', '2', '3']} 

。 但我認爲這不是最理想的做法。任何幫助優化將不勝感激。

+0

你需要絕對使用列表?從關鍵要素開始,必須先排序,剩下的順序是否需要與原始列表保持一致? – Julien

回答

7
>>> seq 
    ['a', 'b', 'c', 'd'] 

>>> {e: [e]+[i for i in seq if i != e] for e in seq} 
    {'a': ['a', 'b', 'c', 'd'], 
    'b': ['b', 'a', 'c', 'd'], 
    'c': ['c', 'a', 'b', 'd'], 
    'd': ['d', 'a', 'b', 'c']} 
1

你可以哈克與字典解析:

my_dict = {elem: list(sorted(my_list, key=lambda x: x != elem)) for elem in my_lst} 

這部作品的sorted函數執行穩定排序的事實,並False小於True

編輯:此方法是少清除並可能較慢,謹慎使用。

+0

在我的電腦上慢了3倍 – Julien

2

更快的方法(而不是接受的答案)較大的名單是

{e: [e] + seq[:i] + seq[i+1:] for i, e in enumerate(seq)} 

相對時間:

In [1]: seq = list(range(1000)) 

In [2]: %timeit {e: [e]+[i for i in seq if i != e] for e in seq} 
10 loops, best of 3: 40.8 ms per loop 

In [3]: %timeit {e: [e] + seq[:i] + seq[i+1:] for i, e in enumerate(seq)} 
100 loops, best of 3: 6.03 ms per loop