Python 压缩列表列表会丢失小数

Python 压缩列表列表会丢失小数,python,nested-lists,Python,Nested Lists,我有一份清单: 玩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

我有一份清单:

玩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')]
为什么它会丢失小数?为什么它们在最终zip中作为单个元素返回?最后:乍一看,这是获取列表和元素的最佳方式吗

print zip(*values[0][3])
您正在压缩“4”、“0.278589”、“0.25531”、“0.302837”。实际上,这将开始迭代4个字符串,并逐个字符遍历它们。由于最短的字符串为4,长度为1,因此您将只看到每个字符串的第一个字符。

使用此选项:

print zip(*values[0][3])

您正在压缩“4”、“0.278589”、“0.25531”、“0.302837”。实际上,这将开始迭代4个字符串,并逐个字符遍历它们。由于最短的字符串是4,长度为1,因此您将只看到每个字符串的第一个字符。

您需要了解此处压缩的内容。值[0][3]是单个列表,其中包含字符串:

>>> values[0][3]
['4', '0.278589', '0.25531', '0.302837']
这些字符串中的每一个都是序列,但是zip只能为列表中最短的序列生成配对。这里是第一个字符串,它只包含一个字符

因此,您将“4”与其他3个字符串中的每个“0”字符配对

接下来,当您只给zip一个序列参数时,您将得到各个元素。您在第三次zip通话中做到了这一点:


这只是一个序列,它被分割成单独的字符。

您需要了解这里压缩的内容。值[0][3]是单个列表,其中包含字符串:

>>> values[0][3]
['4', '0.278589', '0.25531', '0.302837']
这些字符串中的每一个都是序列,但是zip只能为列表中最短的序列生成配对。这里是第一个字符串,它只包含一个字符

因此,您将“4”与其他3个字符串中的每个“0”字符配对

接下来,当您只给zip一个序列参数时,您将得到各个元素。您在第三次zip通话中做到了这一点:

这只是一个序列,它被分割成单独的字符。

第一个zip按预期工作

当压缩*值[0][3]时,即压缩'4',0.278589',0.25531',0.302837',它将遍历每个索引,并将字符串的相应元素字符放入元组中

对于索引0,它创建元组“4”、“0”、“0”、“0”,因为“0”是所有项的第一个字符,但第一个字符是4。然后,第一个字符串用完了字符,所以Zip只将它拉到最短迭代的末尾,如果需要其他行为,请考虑使用Python 3中的迭代工具。这就是为什么它只返回这一个元组

压缩*values[0][3][2]就像调用zip'0.25531'-因为只有一个iterable参数字符串,返回值-per the-

1元组迭代器

i、 e.每个项目都被转换成一个元组,当转换成一个列表时,应该给出['a'、'b'、'c',]OP描述的行为对我来说似乎很奇怪,我无法重现它。

第一个zip按预期工作

当压缩*值[0][3]时,即压缩'4',0.278589',0.25531',0.302837',它将遍历每个索引,并将字符串的相应元素字符放入元组中

对于索引0,它创建元组“4”、“0”、“0”、“0”,因为“0”是所有项的第一个字符,但第一个字符是4。然后,第一个字符串用完了字符,所以Zip只将它拉到最短迭代的末尾,如果需要其他行为,请考虑使用Python 3中的迭代工具。这就是为什么它只返回这一个元组

压缩*values[0][3][2]就像调用zip'0.25531'-因为只有一个iterable参数字符串,返回值-per the-

1元组迭代器


i、 e.每个项目都转换成一个元组,当转换成一个列表时,该元组应给出['a'、'b'、'c',]OP描述的行为对我来说似乎很奇怪,我无法重现。

zip*值[0][3][2]的行为对我来说似乎很奇怪。对于2.7和所有3.x版本的文档,它应该返回['0'、'.'、'2'、'5'、'5'、'3'、'1'、]。您使用的是哪个版本?zip*值[0][3][2]的行为对我来说似乎很奇怪。对于2.7和所有3.x版本的文档,它应该返回['0'、'.'、'2'、'5'、'5'、'3'、'1'、]。你是什么版本的?那么,我怎样才能压缩到最长的版本呢?itertools.zip_longest*值[0][3]返回一个对象。没有*的话,结果是一样的。你的代码用*是正确的。itertools函数通常返回迭代器,这意味着只有在遍历对象时才返回实际对象。您可以使用列表将它们转换为列表,例如:listitertools.zip_longest*值[0][3]这太糟糕了!我试着把它列出来,但我不喜欢
. 我是否必须自己重建每一个价值观,避免一个也没有?这在一行中是如何做到的?避免一行是什么意思?从每个项目中删除它?用其他东西替换它?我的意思是,最短的iterable只有一个字符,其余的都没有。那么,我如何压缩到最长的iterable呢?itertools.zip_longest*值[0][3]返回一个对象。没有*的话,结果是一样的。你的代码用*是正确的。itertools函数通常返回迭代器,这意味着只有在遍历对象时才返回实际对象。您可以使用列表将它们转换为列表,例如:listitertools.zip_longest*值[0][3]这太糟糕了!我试着把它列出来,但我不喜欢。我是否必须自己重建每一个价值观,避免一个也没有?这在一行中是如何做到的?避免一行是什么意思?从每个项目中删除它?用其他字符替换它?我的意思是,最短的iterable只有一个字符,其余的都没有。