压缩列表列表会丢失小数

时间:2014-08-20 08:05:31

标签: python nested-lists

我有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')]

为什么会丢失小数?为什么它们作为最终拉链中的单个元素返回?最后:乍一看,这是获取列表和元素的最佳方式吗?

3 个答案:

答案 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,因此您只能看到每个字符串的第一个字符。