【问题标题】:splitting a list into two lists based on a unique value根据唯一值将列表拆分为两个列表
【发布时间】:2016-03-10 23:07:28
【问题描述】:

我有一个看起来像这样的文本文件:

hello 12
hello 56
world 25
world 26

在 python 中有没有一种方法可以解析从读取这些数据中获得的列表以获得两个单独的嵌套列表(或一个 numpy 数组)?一个用于包含 hello 的前两行,另一个用于包含 world 的接下来的两行。我基本上需要为第一列中的独特内容获取一个单独的嵌套列表(因此以前不知道“hello”和“world”)。

【问题讨论】:

  • 样本数据的结果应该如何?为什么说嵌套列表?
  • 所以你想按第一列分组?
  • print(list(set(x.split()[0] for x in lst))) 如果您发布预期的输出会更好
  • 使用字典进行分组,使用第一列作为键,将行追加到列表中
  • @HumphreyTriscuit 我实际上还没有尝试过任何东西。只是找指针或者库,不一定是准确的解决方案,如果事先不知道唯一字不知道有没有办法拆分。

标签: python python-2.7


【解决方案1】:

使用 dict 并按第一列分组:

from csv import  reader
from collections import defaultdict
with open("in.txt") as f:
    d = defaultdict(list)
    for k, v in reader(f,delimiter=" "):
        d[k].append(v)

print(d.values())

这将为您提供两个单独列表中的所有值:

[['25', '26'], ['12', '56']

如果数据总是在两个部分中,您可以使用 groupby:

from itertools import groupby
from csv import  reader
from operator import itemgetter

with open("in.txt") as f:
    print([list(map(itemgetter(1), v)) 
           for k, v in groupby(reader(f,delimiter=" "), key=itemgetter(0))])

这将给出相同的输出:

 [['12', '56'], ['25', '26']]

【讨论】:

  • 感谢您的回答!我刚试过这个,效果很好。您使用的第二种方法是我要稍微解析一下以了解更多信息。
  • 不用担心,groupby 只是将具有相同第一个元素的连续元素分组,即 itemgetter(0)。我们只是从每个组中提取每个第二个元素,即理解中的每个 v
【解决方案2】:

由于您似乎不确定哪种数据结构适合存储结果,因此我建议使用有序字典将第一列中的关键字映射到整数值列表(按它们出现的顺序) :

>>> from collections import OrderedDict
>>> result = OrderedDict()
>>> with  open('input.txt') as f:
...     for line in f:
...         key, val = line.split()
...         result.setdefault(key, []).append(int(val))
... 
>>> result
OrderedDict([('hello', [12, 56]), ('world', [25, 26]))

【讨论】:

  • 非常感谢您的回答。我也无法接受您的回答,但我确实尝试过并且效果很好。非常感谢!
【解决方案3】:

循环这个:

dict={}
#start the loop here
x=readdatafromfile.split()

if x[0] not in dict.keys():
    dict[x[0]] = list()
dict[x[0]].append(x[1])

#end loop here
print dict.keys() #for first column
print dict['hello'] #for list of values of hello

【讨论】:

    猜你喜欢
    • 2015-05-13
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-13
    • 2020-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多