我有一个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
字典?
答案 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']}
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']}