问题:如何有效地和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)。
答案 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}