将列表转换为元组的分组列表?

时间:2013-04-15 17:57:13

标签: python

我有这个清单:

['Ben\n', '5 0 0 5 -5 \n', 'Moose\n', '5 5 0 3 0 0 \n', ...]

长期以来一直这样。我需要将此列表放入这样的元组列表中:

[('Ben', '5 0 0 5 -5'), ('Moose', '5 5 0 3 0 0'), ...] and so on.

我觉得这应该很容易。
我已经打开了文本文件并将其拆分为一个列表:

e = open("bookratings.txt", "r")
elines = e.readlines()

但我不知道从哪里去?

3 个答案:

答案 0 :(得分:5)

看起来每个人在下一行都有相关数据,因此每人产生两行数据。 你可以zip

lst = list(zip(*[iter(lst)]*2))

答案 1 :(得分:3)

你走了:

>>> li=['Ben\n', '5 0 0 5 -5 \n', 'Moose\n', '5 5 0 3 0 0 \n']
>>> zip(*[(e.strip() for e in li)]*2)
[('Ben', '5 0 0 5 -5'), ('Moose', '5 5 0 3 0 0')]

zip(*[iter(s)]*n)部分基于zipidiom for clustering a data series into n-length groups的{​​{1}}上的Python文档。

我在里面添加了发电机以去除回车。生成器表达式出现后,不再需要iter。 (谢谢@StevenRumbalski)

当然,你提到你有像这样的文件这样的文件:

Ben
5 0 0 0 -5
Moose
5 5 0 3 0 0
...

如果是这样,这里有一个替代方案,您不必阅读整个文件:

>>> with open('/tmp/lines.txt','r') as f:
...    it=iter(f)
...    li=[(i.strip(),it.next().strip()) for i in it]
... 
>>> li
[('Ben', '5 0 0 0 -5'), ('Moose', '5 5 0 3 0 0')]

答案 2 :(得分:0)

尝试

>>a = ['Ben\n', '5 0 0 5 -5 \n', 'Moose\n', '5 5 0 3 0 0 \n']

>>b = ''.join(a).split('\n')

现在

>> c = [(b[i],b[i+1]) for i in range(0,len(b)-1,2)]

应该给你结果

[('Ben', '5 0 0 5 -5 '), ('Moose', '5 5 0 3 0 0 ')]