Python 在字典中合并两个列表
我有两个.txt文件,其中一个(a)包含类别(、a、a、a…)信息,另一个(b)包含值。 我需要合并和拆分它们Python 在字典中合并两个列表,python,python-3.x,dictionary,built-in,Python,Python 3.x,Dictionary,Built In,我有两个.txt文件,其中一个(a)包含类别(、a、a、a…)信息,另一个(b)包含值。 我需要合并和拆分它们 谢谢你的帮助 我想你在追求这样的东西: def read_file(filename): with open(filename) as f: return f.read().split('\n') def read_data(categories, values): parsed_data = {} for key, value in zip(
谢谢你的帮助 我想你在追求这样的东西:
def read_file(filename):
with open(filename) as f:
return f.read().split('\n')
def read_data(categories, values):
parsed_data = {}
for key, value in zip(read_file(categories), read_file(values)):
if key not in parsed_data:
parsed_data[key] = [[value]]
elif key != previous_key:
parsed_data[key].append([value])
else:
parsed_data[key][-1].append(value)
previous_key = key
return parsed_data
print(read_data('categories.txt', 'values.txt'))
import itertools
def accumulator(seriesA,seriesB):
results = {}
for a,grouped in itertools.groupby(zip(seriesA,seriesB), key=lambda x:x[0]):
values = [x[1] for x in grouped]
count = len(values)
mean = sum(values)/count
results.setdefault(a, []).append(dict(values=values, count=count, mean=mean))
return results
- 我制作了一个方便的函数,用于读取文件和拆分行,以进行一些较小的代码重复消除
- 您不需要从
创建列表来迭代它zip
- 我选择退回字典而不是打印它,这样你也可以用其他方式使用它
def dict4(a, b):
pairs = list(zip((open(a).read()).split("\n"), (open(b).read().split("\n"))))
dict1 = dict()
# Store the key before the current one
# to detect segments
key_before = None
for key,value in pairs:
# Don't add an empty string as a key
if key not in dict1 and key != '':
dict1[key] = list()
if key != '':
# Append the new value to the last list
# in the list that is stored at index key
# or append a new list with the value
if key_before == key:
dict1[key][len(dict1[key])-1].append(value)
else:
dict1[key].append([value])
key_before = key
根据我对问题的理解,您将输入解析为并行流,其中第一个输入是标签,第二个是值。我理解标签是一组标签,这意味着结果将是标签/键上的一组值 我从后面的评论中收集到,您还需要平均数、计数和其他信息 对于该功能,我认为您可以使用如下内容:
def read_file(filename):
with open(filename) as f:
return f.read().split('\n')
def read_data(categories, values):
parsed_data = {}
for key, value in zip(read_file(categories), read_file(values)):
if key not in parsed_data:
parsed_data[key] = [[value]]
elif key != previous_key:
parsed_data[key].append([value])
else:
parsed_data[key][-1].append(value)
previous_key = key
return parsed_data
print(read_data('categories.txt', 'values.txt'))
import itertools
def accumulator(seriesA,seriesB):
results = {}
for a,grouped in itertools.groupby(zip(seriesA,seriesB), key=lambda x:x[0]):
values = [x[1] for x in grouped]
count = len(values)
mean = sum(values)/count
results.setdefault(a, []).append(dict(values=values, count=count, mean=mean))
return results
为了清晰起见,我使用您的样本数据而不是读取文件在本地对其进行了测试:
# SIMULATE the file reads for this example!
input_A = ['_','_','A','A','A','_','_','B','B','A','A']
input_B = [1.0, 1.264, 20.646, 14.346, 16.645, 327.5, 34.646, 343.97, 12.66, 147.2, 364.5454]
import pprint
pprint.pprint(accumulator(input_A, input_B), width=120)
结果如下:
$ python accumulator.py
{'A': [{'count': 3, 'mean': 17.212333333333333, 'values': [20.646, 14.346, 16.645]},
{'count': 2, 'mean': 255.87269999999998, 'values': [147.2, 364.5454]}],
'B': [{'count': 2, 'mean': 178.31500000000003, 'values': [343.97, 12.66]}],
'_': [{'count': 2, 'mean': 1.1320000000000001, 'values': [1.0, 1.264]},
{'count': 2, 'mean': 181.073, 'values': [327.5, 34.646]}]}
d['A'][1]将是A的第二段,因为基于零的索引;)您似乎在第一列的标签上执行“groupby”来决定第二列的值组,对吗?我可以在回答中说明这一点……嗨,这项工作对我来说真的是最好的,谢谢你的帮助。我可以再问一个问题吗?我如何将每个分段的平均值和长度添加到分段值中,如{'values':[20.646,14.346,16.645],'mean':1721233333,'length':3}。对于平均值,您可以导入统计数据,并使用统计数据。如果你需要更多的细节,我会在这里开始一个新的问题,这里的评论不是用来问和回答单独的问题!祝你好运。非常感谢你,我开始明白我做错了什么。非常感谢你,这是一个非常干净和好的回答,让我理解!您好,当我尝试使用自己的数据时,我遇到了以下错误:TypeError:不支持+:“int”和“str”的操作数类型。似乎是关于mean=sum(values)/count计算,这是因为您需要先将
serieb
中的数据转换为float。您可以在第二个代码块中看到:数字周围没有引号。要将字符串列表转换为带有serieb=[float(item)for item in serieb]
的浮点数列表,正如@Jasmijn所说,必须将传入文件转换为正确的类型。您可以通过为分组中的x赋值values=[float(x[1])
或作为文件加载的一部分来完成。换一个音符——如果你认为你的问题被回答了,你应该相应地标记答案;