Associating list value in python dictionary with relevant key
我有一个两列选项卡分隔的输入,我想在
样本输入:
1 2 3 4 5 6 7 8 | cat tail cat whisker cat meow cat black dog tail dog paw dog bark bird beak |
我已经编写了以下代码,它生成了一个(尽管错误)输出,其中包含我要查找的字典格式,它将col1中的一个键与col2中的所有值关联起来。
我一直使用的代码是:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #!/usr/bin/python # -*- coding: utf-8 -*- keys = [] values = [] with open('animal-trial',"rU") as f: for line in f: line = line.split() keys.append(line[0]) values.append(line[1]) d = {} for k,v in zip(keys, values): d.setdefault(k, []).append(v) print d |
我查过其他参考文献[这里]、[这里]和[这里],但是,所有的建议,包括与
实际输出为:
1 2 3 4 5 6 7 8 | {'cat': ['tail']} {'cat': ['tail', 'whisker']} {'cat': ['tail', 'whisker', 'meow']} {'cat': ['tail', 'whisker', 'meow', 'black']} {'dog': ['tail'], 'cat': ['tail', 'whisker', 'meow', 'black']} {'dog': ['tail', 'paw'], 'cat': ['tail', 'whisker', 'meow', 'black']} {'dog': ['tail', 'paw', 'bark'], 'cat': ['tail', 'whisker', 'meow', 'black']} {'bird': ['beak'], 'dog': ['tail', 'paw', 'bark'], 'cat': ['tail', 'whisker', 'meow', 'black']} |
所需输出为
1 | {'bird': ['beak'], 'dog': ['tail', 'paw', 'bark'], 'cat': ['tail', 'whisker', 'meow', 'black']} |
有人能指出我在哪里犯了一个错误或有一个更全面的解决方案,以便最终的结果是
您可以检查键是否存在,如果存在,则追加,如果不存在,则使用单个元素创建一个列表:
1 2 3 4 5 6 7 8 9 10 | d = {} with open('a12', 'r') as f: for line in f: if line.strip(): a = line.split() if a[0] not in d: d[a[0]] = [a[1]] else: d[a[0]].append(a[1]) print d |
输出:
1 | {'cat': ['tail', 'whisker', 'meow', 'black'], 'bird': ['beak'], 'dog': ['tail', 'paw', 'bark']} |
熊猫:
1 2 3 4 | import pandas as pd df = pd.read_csv('file_name', header=None, sep='\s+') print df.groupby(0)[1].apply(list).to_dict() |
输出:
1 | {'dog': ['tail', 'paw', 'bark'], 'bird': ['beak'], 'cat': ['tail', 'whisker', 'meow', 'black']} |
我假设您有一个名为
您也可以使用来自
1 2 3 4 5 6 7 8 | from itertools import groupby data = list(k.rstrip().split() for k in open("f_input.txt", 'r')) final = {} for k, v in groupby(data, lambda x : x[0]): final[k] = list(k[1] for k in list(v)) print(final) |
输出:
1 | {'bird': ['beak'], 'dog': ['tail', 'paw', 'bark'], 'cat': ['tail', 'whisker', 'meow', 'black']} |
这可以用默认的defaultdict来解决。
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | from collections import defaultdict def main(): keys = [] values = [] with open('animal-trial',"rU") as f: for line in f: line = line.split() keys.append(line[0]) values.append(line[1]) d = defaultdict(list) for k,v in zip(keys, values): d[k].append(v) print(dict(d)) if __name__ =="__main__": main() |
输出:
1 | {'cat': ['tail', 'whisker', 'meow', 'black'], 'bird': ['beak'], 'dog': ['tail', 'paw', 'bark']} |
假设您已将输入拆分为""
1 2 3 4 5 6 7 | d = {} tab = ['cat tail', 'cat whisker', 'cat meow', 'cat black', 'dog tail', 'dog paw', 'dog bark', 'bird beak'] for i in tab: try: d[i.split("")[0]] += [i.split("")[1]] except KeyError: d[i.split("")[0]] = [i.split("")[1]] |
输出
{'bird': ['beak'], 'dog': ['tail', 'paw', 'bark'], 'cat': ['tail', 'whisker', 'meow', 'black']}