将python字典中的列表值与相关键相关联

时间:2017-01-27 15:10:27

标签: python dictionary

我有一个2列制表符分隔输入,我想填充python中的字典。第一列与密钥相关联(存在重复项),第二列与该值相关联。

示例输入:

cat tail
cat whisker
cat meow
cat black
dog tail
dog paw
dog bark
bird    beak

我编写了以下代码,它产生一个(虽然错误的)输出,其中包含我要查找的字典格式,它将col1中的一个键与col2中的所有值相关联。

我一直使用的代码是:

#!/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

我已查找了其他参考文献 [HERE][HERE][HERE],但是,包括defaultdicts在内的所有建议都会将我带到同一输出,而不是期望的输出。

实际输出为:

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

所需的输出

{'bird': ['beak'], 'dog': ['tail', 'paw', 'bark'], 'cat': ['tail', 'whisker', 'meow', 'black']} 

有人能指出我在哪里犯错误或有更全面的解决方案,以便最终结果是one字典?

4 个答案:

答案 0 :(得分:2)

您可以检查密钥是否存在,是否存在然后追加,如果不存在则创建一个包含单个元素的列表:

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

输出:

{'cat': ['tail', 'whisker', 'meow', 'black'], 'bird': ['beak'], 'dog': ['tail', 'paw', 'bark']}

使用pandas:

import pandas as pd

df = pd.read_csv('file_name', header=None, sep='\s+')
print df.groupby(0)[1].apply(list).to_dict()

输出:

{'dog': ['tail', 'paw', 'bark'], 'bird': ['beak'], 'cat': ['tail', 'whisker', 'meow', 'black']}

答案 1 :(得分:1)

我假设您有一个名为f_input.txt的输入文件。

您也可以使用groupby模块中的itertools,例如:

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)

输出:

{'bird': ['beak'], 'dog': ['tail', 'paw', 'bark'], 'cat': ['tail', 'whisker', 'meow', 'black']}

答案 2 :(得分:0)

假设您已将输入拆分为" \ n"

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

输出

  

{'鸟':[' beak'],' dog':[' tail',' paw&#39 ;,' bark'],':[' tail',' whisker',' meow',& #39;黑色']}

答案 3 :(得分:0)

这可以使用默认的defaultdict

来解决

代码:

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()

输出:

{'cat': ['tail', 'whisker', 'meow', 'black'], 'bird': ['beak'], 'dog': ['tail', 'paw', 'bark']}