在Python中,将list转换为dict,以便第n个元素是一个键

时间:2017-06-22 11:35:44

标签: python list dictionary time-complexity

问题:如何有效地和python地将列表my_list转换为dict my_dict,以便每个嵌套列表的第0个元素是键,其余元素是一个值(也是列表)。

示例:

输入:

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)复杂性)。我设法通过迭代输入列表并弹出第0个元素来编写一个完成工作的函数,但popping is itself O(n)使整个解O(n * n)。

6 个答案:

答案 0 :(得分:7)

使用词典理解。值列表或None是通过使用None运算符使用or将索引1中的列表切片短路来创建的:

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']}

<强>复杂性

这个词的复杂性。可比。是 O (n * m),其中 n 是列表中的项目数, m 是最大切片的长度。这里的增益不会降低时间复杂度,而是降低CPU时间。

答案 1 :(得分: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']}

答案 2 :(得分:0)

你可以,

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

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

但请记住,键中不应有任何重复

答案 4 :(得分:0)

列表切片具有O(N)复杂度,如果使用元组则相同。在给定的输入数据结构中,我担心你不能比O(N * N)更好。

答案 5 :(得分:0)

使用dict 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}