【问题标题】:Get a dict from a python list从 python 列表中获取字典
【发布时间】:2016-01-10 14:34:14
【问题描述】:

我有一个列表 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']}

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

【问题讨论】:

  • 你需要绝对使用列表吗?除了必须先出现的关键元素之外,其余元素的顺序是否需要与原始列表保持相同?

标签: python list python-2.7 dictionary


【解决方案1】:
>>> 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']}

【讨论】:

    【解决方案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
    

    【讨论】:

      【解决方案3】:

      你可以用字典理解来搞定:

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

      这适用于sorted 函数执行稳定排序的事实,并且False 小于True

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

      【讨论】:

      • 在我的电脑上慢 3 倍
      猜你喜欢
      • 2020-03-26
      • 1970-01-01
      • 1970-01-01
      • 2011-10-28
      • 2011-11-08
      • 1970-01-01
      • 2017-10-23
      相关资源
      最近更新 更多