Python 在字典中合并两个列表

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(

我有两个.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(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])
或作为文件加载的一部分来完成。换一个音符——如果你认为你的问题被回答了,你应该相应地标记答案;