我有list of lists of lists
:
[ [['1', '3.61912', '3.25558', '3.98787'], ['2', '5.35465', '4.98407', '5.82305'], ['3', '14.8184', '13.8878', '15.7686'], ['4', '0.278589', '0.25531', '0.302837'], ['5', '6.65982', '6.5638', '6.75855'], ['6', '0.05', '0', '0'], ['7', '0.00747086', '0.00620575', '0.00873102'], ['999', '0.', '0.', '0.'], ['998', '0.897487603306', '0.897487603306', '0.897487603306']],
[['1', '6.14332', '5.24188', '7.06803'], ['2', '5.73822', '5.31854', '6.27864'], ['3', '19.1023', '17.4778', '20.901'], ['4', '0.113164', '0.0963808', '0.13141'], ['5', '6.56417', '6.49081', '6.63889'], ['6', '0.05', '0', '0'], ['7', '0.00959252', '0.00842128', '0.0107523'], ['999', '0.', '0.', '0.'], ['998', '1.06972222222', '1.06972222222', '1.06972222222']],
[['1', '14.3005', '12.9284', '15.7195'], ['2', '5.25181', '4.8594', '5.77533'], ['3', '16.0296', '14.4662', '17.7269'], ['4', '0.263088', '0.216536', '0.316766'], ['5', '6.55534', '6.40134', '6.73512'], ['6', '0.05', '0', '0'], ['7', '0.00660481', '0.00493246', '0.00825176'], ['999', '0.', '0.', '0.'], ['998', '1.01537254902', '1.01537254902', '1.01537254902']] ]
与zip
一起玩,了解它是如何运作的,我打印出来了:
print zip(*list[0]) --> [('1', '2', '3', '4', '5', '6', '7', '999', '998'), ('3.61912', '5.35465', '14.8184', '0.278589', '6.65982', '0.05', '0.00747086', '0.', '0.897487603306'), ('3.25558', '4.98407', '13.8878', '0.25531', '6.5638', '0', '0.00620575', '0.', '0.897487603306'), ('3.98787', '5.82305', '15.7686', '0.302837', '6.75855', '0', '0.00873102', '0.', '0.897487603306')]
如果再次拉链,我会丢失小数:
print zip(*values[0][3]) --> [('4', '0', '0', '0')]
另外,最后一次拉链导致最奇怪的事情:
print zip(*values[0][3][2]) --> [('0', '.', '2', '5', '5', '3', '1')]
为什么会丢失小数?为什么它们作为最终拉链中的单个元素返回?最后:乍一看,这是获取列表和元素的最佳方式吗?
答案 0 :(得分:4)
你需要了解你在这里拉链的内容。 values[0][3]
是单个列表,其中一个包含字符串:
>>> values[0][3]
['4', '0.278589', '0.25531', '0.302837']
这些字符串中的每一个都是序列,但zip()
只能为列表中的最短序列生成配对。这是第一个字符串,其中只包含一个字符。
因此,您将'4'
与其他3个字符串中的每个'0'
字符配对。
接下来,当您为zip()
提供一个序列参数时,您将获得各个元素。您通过第3次zip()
电话完成了此操作:
>>> values[0][3][2]
'0.25531'
>>> list(values[0][3][2])
['0', '.', '2', '5', '5', '3', '1']
这只是一个序列,它被分成单个字符。
答案 1 :(得分:3)
第一个zip
按预期工作。
当你压缩*values[0][3]
(即zip('4', '0.278589', '0.25531', '0.302837')
)时,它会遍历每个索引并将相应的元素(字符串的字符)放入元组中。
对于索引0
,它会创建元组('4', '0', '0', '0')
(因为'0'
是除第一个项以外的所有项的第一个字符,它是4
)。然后,第一个字符串用完了字符,因此zip
停止(它只会拉到最短迭代的末尾,如果你想要,可以考虑使用{3}}(Python 3中的itertools.izip_longest()
)其他行为)。这就是为什么它只返回这一个元组。
压缩itertools.zip_longest
就像调用*values[0][3][2]
- 因为只有一个可迭代的参数(字符串),返回值 - 每docs - 是
1元组的迭代器
即。每个项目都变成了一个元组,当变成一个列表时应该给zip('0.25531')
(OP描述的行为对我来说似乎很奇怪,我无法重现它。)
答案 2 :(得分:2)
有了这个:
print zip(*values[0][3])
你正在试图('4', '0.278589', '0.25531', '0.302837')
。实际上,这将开始迭代4个字符串并逐个字符地遍历它们。由于最短字符串为4
,长度为1,因此您只能看到每个字符串的第一个字符。