从python列表中获取一个字典

时间:2015-10-13 01:05:47

标签: python list python-2.7 dictionary

我有一个列表my_list = ['a', 'b', 'c', 'd'],我需要创建一个类似于

的字典
{ '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']}

根据要求。 但我认为这不是最佳的做法。任何优化的帮助将不胜感激。

3 个答案:

答案 0 :(得分: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 :(得分: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

答案 2 :(得分:1)

你可以通过词典理解得到hacky:

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

这适用于sorted函数执行稳定排序且False小于True

的事实

编辑:此方法不太清晰,可能较慢,请谨慎使用。