所以我想知道是否有可能将列表的子列表放入字典中。
例如,列表包含:
cy = [["a", "b", "a"], ["a", "b", "c", "d", "a"], ["c", "b", "a", "c"], ["d, "b", "a", "d"]]
将根据子列表的第一个字母
存储到字典中 {a : ["a", "b", "a"], c : ["c", "b", "a", "c"], d: ["d, "b", "a", "d"] }
请注意,它只存储以" a"开头的密钥的第一个子列表。而不是下一个。
我的代码如下:
def syn(graph,start):
empty = []
cy = [["a", "b", "a"], ["a", "b", "c", "d", "a"], ["c", "b", "a", "c"], ["d, "b", "a", "d"]]
lei = dict()
for items in cy:
if items[0] in lei:
lei[items[0]] += items
else:
lei[items[0]] = items
return lei
但我得到的只是
{a : ["a", "b", "a"]}
有什么方法可以解决这个问题吗?
答案 0 :(得分:2)
简单dict
理解:
cy = [["a", "b", "a"], ["a", "b", "c", "d", "a"], ["c", "b", "a", "c"], ["d", "b", "a", "d"]]
result = {l[0]: l[:] for l in cy[::-1]}
print(result)
输出:
{'a': ['a', 'b', 'a'], 'c': ['c', 'b', 'a', 'c'], 'd': ['d', 'b', 'a', 'd']}
cy[::-1]
- 以相反的顺序处理输入列表,以防止重叠 next "键" 答案 1 :(得分:0)
最直接的方法是迭代列表向后,根据第一个元素将列表添加到dict
。由于您向后退,这可以保证第一个子列表将成为您dict
中包含的列表:
>>> result = {}
>>> for sub in reversed(cy):
... result[sub[0]] = sub
...
>>> result
{'d': ['d', 'b', 'a', 'd'], 'a': ['a', 'b', 'a'], 'c': ['c', 'b', 'a', 'c']}
>>>
所以,你会保持最后遇到的值,但是反向顺序列表的最后一个值是正向顺序的第一个值!
答案 2 :(得分:0)
虽然你可以非常巧妙地向后迭代,正如@ juanpa.arrivillaga和@RomanPerekhrest解决方案所示,另一种方法是简单地遍历列表并使用any
函数:
cy = [["a", "b", "a"], ["a", "b", "c", "d", "a"], ["c", "b", "a", "c"], ["d", "b", "a", "d"]]
new_list = []
for i in cy:
if not any(i[0] == b[0] for b in new_list):
new_list.append(i)
final_dict = {i[0]:i for i in new_list}
输出:
{'a': ['a', 'b', 'a'], 'c': ['c', 'b', 'a', 'c'], 'd': ['d', 'b', 'a', 'd']}
答案 3 :(得分:0)
使用pandas:
import pandas as pd
cy = [["a", "b", "a"], ["a", "b", "c", "d", "a"], ["c", "b", "a", "c"], ["d", "b", "a", "d"]]
# create a df
df = pd.DataFrame([[i] for i in cy],[i[0] for i in cy])
# export it in reverse order
df.iloc[::-1].T.to_dict(orient='rows')[0]
返回:
{'a': ['a', 'b', 'a'], 'c': ['c', 'b', 'a', 'c'], 'd': ['d', 'b', 'a', 'd']}