【问题标题】:Grouping Lists into specific groups将列表分组为特定组
【发布时间】:2019-11-13 10:35:35
【问题描述】:

我想知道是否可以将列表转换为特定的组,以后我可以将它们以表格格式放置到其中。

这是我需要分组的输出,我将它们转换为列表,以便我可以轻松地将它们划分为表格。

f=open("sample1.txt", "r")
f.read()

这是输出:

'0245984300999992018010100004+14650+121050FM-12+004699999V0203001N00101090001CN008000199+02141+01971101171ADDAY141021AY241021GA1021+006001081GA2061+090001021GE19MSL   +99999+99999GF106991021999006001999999KA1120N+02111MD1210141+9999MW1051REMSYN10498430 31558 63001 10214 20197 40117 52014 70544 82108 333 20211 55062 56999 59012 82820 86280 555 60973=\n'

这是我已经完成的。我设法将其更改为导致此输出的列表:

with open('sample1.txt', 'r') as file:
data = file.read().replace('\n', '')
print (list(data))

输出:

['0', '2', '4', '5', '9', '8', '4', '3', '0', '0', '9', '9 ','9','9','9','2','0','1','8','0','1','0','1','0', '0'、'0'、'0'、'4'、'+'、'1'、'4'、'6'、'5'、'0'、'+'、'1'、'2 ', '1', '0', '5', '0', 'F', 'M', '-', '1', '2', '+', '0', '0', '4'、'6'、'9'、'9'、'9'、'9'、'9'、'V'、'0'、'2'、'0'、'3'、'0' ','0','1','N','0','0','1','0','1','0','9','0','0', '0'、'1'、'C'、'N'、'0'、'0'、'8'、'0'、'0'、'0'、'1'、'9'、'9 ', '+', '0', '2', '1', '4', '1', '+', '0', '1', '9', '7', '1', '1'、'0'、'1'、'1'、'7'、'1'、'A'、'D'、'D'、'A'、'Y'、'1'、'4 ','1','0','2','1','A','Y','2','4','1','0','2','1', 'G'、'A'、'1'、'0'、'2'、'1'、'+'、'0'、'0'、'6'、'0'、'0'、'1 ','0','8','1','G','A','2','0','6','1','+','0','9', '0'、'0'、'0'、'1'、'0'、'2'、'1'、'G'、'E'、'1'、'9'、'M'、'S '、'L'、''、''、''、'+'、'9'、'9'、'9'、'9'、'9'、'+'、'9'、'9' ,'9','9','9','G','F','1','0','6','9','9','1','0',' 2'、'1'、'9'、'9'、'9'、'0'、'0'、'6'、'0'、'0'、'1'、'9'、' 9'、'9'、'9'、'9'、'9'、'K'、'A'、'1'、'1'、'2'、'0'、'N'、'+' , '0', '2', '1', '1', '1', 'M', 'D', '1', '2', '1', '0', '1', ' 4'、'1'、'+'、'9'、'9'、'9'、'9'、'M'、'W'、'1'、'0'、'5'、'1' 、'R'、'E'、'M'、'S'、'Y'、'N'、'1'、'0'、'4'、'9'、'8'、'4'、' 3'、'0'、''、'3'、'1'、'5'、'5'、'8'、''、'6'、'3'、'0'、'0'、' 1'、''、'1'、'0'、'2'、'1'、'4'、''、'2'、'0'、'1'、'9'、'7'、' '、'4'、'0'、'1'、'1'、'7'、''、'5'、'2'、'0'、'1'、'4'、''、'7 '、'0'、'5'、'4'、'4'、''、'8'、'2'、'1'、'0'、'8'、''、'3'、'3 '、'3'、''、'2'、'0'、'2'、'1'、'1'、''、'5'、'5'、'0'、'6'、'2 '、''、'5'、'6'、'9'、'9'、'9'、''、'5'、'9'、'0'、'1'、'2'、'' ,'8','2','8','2','0','','8','6','2','8','0','','5' , '5', '5', ' ', '6', '0', '9', '7', '3', '=']

我的目标是将它们分为以下几类:

0245,984300,99999,2018,01,01,0000,4,+1.... 

每一列的位数是预先确定的,例如第一列总是4位,第二列总是6位,以此类推。

我正在考虑将它们连接起来。但我不确定这是否可能。

【问题讨论】:

  • 嗨!因此,为每个组分配了特定数量的数字。就像第一组总是有 4 个数字,第二个总是包含 6 个数字,第三个是 4 个数字,依此类推......
  • 因此您可以遍历您生成的列表并根据每个组的模式编写逻辑,简单的连接将起作用。该列表包含所有字符,因此连接根本不是问题。
  • 那么,如何将列表分成组?这背后有什么逻辑吗?
  • @KrishnaSantos 你的第三组有 5 位数字
  • 这背后的逻辑是这是一个天气数据,因此每个代码/组都会有相应的含义。 @VJAYSLN

标签: python python-3.x grouping listings


【解决方案1】:

您可以使用operator.itemgetter

from operator import itemgetter

g = itemgetter(slice(0, 4), slice(4, 10))
with open('sample1.txt') as file:
    for line in file:
        print(g(line))

或者更好的是,您可以使用 zip 和 itertools.accumulate 动态制作切片:

indexes = [4, 6, ...]
g = itemgetter(*map(slice, *map(accumulate, zip([0]+indexes, indexes))))

然后像以前一样进行

【讨论】:

  • 嗨!我试过这个,但输出变成了这样:('0245','843009')而不是('0245','984300')。就好像第二组的顺序相反。
  • 糟糕,我更正了。它应该是 4-10 而不是 5-11。切片不包括上限。
  • 也添加了更好的选择
  • 嗨! @Jab 我想知道每当我尝试将它放入桌子时。它总是说有一个“无”值。
  • 对像这样(在第一个 sn-p 中)一起使用 itemgetter()slice() 的想法表示敬意——非常聪明,而且从文档中看不出它是可能的。跨度>
【解决方案2】:

如果您真的想使用这些数据,我建议您命名所有内容,并仔细检查所有长度是否有意义。所以开始你做

with open('sample1.txt', 'r') as file:
    data = file.read().rstrip('\n"')
    first, second, *rest = data.split()

    if len(first) != 163:
        raise ValueError(f"The first part should be 163 characters long, but it's {len(first)}")
    if len(second) != 163:
        raise ValueError(f"The second part should be  characters long, but it's {len(first)}")

所以现在你有 3 个变量

  • first"0245984300999992018010100004+14650+121050FM-12+004699999V0203001N00101090001CN008000199+02141+01971101171ADDAY141021AY241021GA1021+006001081GA2061+090001021GE19MSL"
  • second"+99999+99999GF106991021999006001999999KA1120N+02111MD1210141+9999MW1051REMSYN10498430"
  • rest['31558', '63001', '10214', '20197', '40117', '52014', '70544', '82108', '333', '20211', '55062', '56999', '59012', '82820', '86280', '555', '60973']

然后重复这个想法

date, whatever, whatever2, whatever3 = first.split('+')

然后为了解析第一部分,我将有一个类似的列表

something = date[0:4]
something_else = date[4:10]
third_thing = date[10:15]
year = [15:19]
month = [19:21]
day = [21:23]

等等。然后您可以在分析它们的代码中使用所有这些变量。

如果这是某种标准,您应该寻找一个可以解析类似字符串的库或自己编写一个。

显然更好地命名变量

【讨论】:

  • 嗨!所以我尝试运行它。这导致错误: ValueError: The second part should be characters long, but it's 163
  • 您应该阅读并理解我要告诉您的操作,而不是按原样运行代码。我写的很匆忙,它只是一个关于如何解决问题的一般指南。
  • 我没有测量第二个字符串应该有多长,找出它是 len 并将第二个 163 更改为正确的值
  • 另外,正如我所说,你确定这不是一个标准或者其他人已经为它编写了一个库吗?
猜你喜欢
  • 2017-05-06
  • 1970-01-01
  • 2021-03-31
  • 2011-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多