Python 将列表转换为具有3个元素的元组的列表?

Python 将列表转换为具有3个元素的元组的列表?,python,list,tuples,Python,List,Tuples,好的,我是Python新手,正在学习元组和列表。我被要求创建一个程序,但该程序涉及转换以下列表: li = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18] 在下面的列表中: li = [[(1,2,3),(4,5,6)],[(7,8,9),(10,11,12)],[(13,14,15),(16,17,18)] 基本上,从一个简单的列表到一个包含两个元组(包含3个元素)的子列表 我感谢你的帮助 谢谢。使用: 使用: 解决这个问题的简

好的,我是Python新手,正在学习元组和列表。我被要求创建一个程序,但该程序涉及转换以下列表:

    li = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18]
在下面的列表中:

    li = [[(1,2,3),(4,5,6)],[(7,8,9),(10,11,12)],[(13,14,15),(16,17,18)]
基本上,从一个简单的列表到一个包含两个元组(包含3个元素)的子列表

我感谢你的帮助

谢谢。

使用:

使用:


解决这个问题的简单方法是分两步进行:首先,将其分解为3元组列表。然后,将其分解为两个列表

每个步骤有两种方法


第一种是使用切片和测距:

>>> li = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18]
>>> [li[i:i+3] for i in range(0, len(li), 3)]
[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12], [13, 14, 15], [16, 17, 18]]
但我们需要3元组,而不是3列表,因此需要在表达式周围添加
tuple()

>>> li_3 = [tuple(li[i:i+3]) for i in range(0, len(li), 3)]
然后,我们再次做同样的事情:

>>> li_23 = [li_3[i:i+2] for i in range(0, len(li_3), 2)]

另一种方法是将同一迭代器压缩到自身。文档中的说明说明了如何执行此操作。事实上,让我们复制并粘贴食谱,然后我们就可以使用它了

>>> from itertools import izip_longest
>>> def grouper(iterable, n, fillvalue=None):
...    "Collect data into fixed-length chunks or blocks"
...    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx
...    args = [iter(iterable)] * n
...    return izip_longest(fillvalue=fillvalue, *args)
现在:

现在我们重复同样的步骤:

>>> list(grouper(grouper(li, 3), 2))
[((1, 2, 3), (4, 5, 6)), ((7, 8, 9), (10, 11, 12)), ((13, 14, 15), (16, 17, 18))]
除了我们得到元组的元组,我们需要元组的列表,所以:

>>> li_23 = [list(group) for group in grouper(grouper(li, 3), 2)]

在Python中,应该有一种也是唯一一种显而易见的方法来做事情。那么,是哪一个

  • 第一个需要一个列表或其他序列;第二种方法可以任意选择
  • 如果在末尾有剩余值,则第一个将为您提供一个部分组;第二组是最后一组
  • 第二个很容易修改,删除不完整的最后一个组,而不是填充它,并且不太难修改,为您提供一个部分组;第一个更难修改
  • 第一个对于新手来说更容易理解,但是一旦你了解了这个概念,可能就更难阅读了
  • 其中一个可以很容易地包装到函数中,但第二个已经包装到recipes(或
    more\u itertools
    第三方软件包)中

这些差异中的一个通常会对您的用例产生影响,在这种情况下,最明显的方法就是做您想要做的事情。对于这样的简单情况,如果这些都不重要,请选择您认为更可读的方法。

解决此问题的简单方法是分两步进行:首先,将其分解为3元组列表。然后,将其分解为两个列表

每个步骤有两种方法


第一种是使用切片和测距:

>>> li = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18]
>>> [li[i:i+3] for i in range(0, len(li), 3)]
[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12], [13, 14, 15], [16, 17, 18]]
但我们需要3元组,而不是3列表,因此需要在表达式周围添加
tuple()

>>> li_3 = [tuple(li[i:i+3]) for i in range(0, len(li), 3)]
然后,我们再次做同样的事情:

>>> li_23 = [li_3[i:i+2] for i in range(0, len(li_3), 2)]

另一种方法是将同一迭代器压缩到自身。文档中的说明说明了如何执行此操作。事实上,让我们复制并粘贴食谱,然后我们就可以使用它了

>>> from itertools import izip_longest
>>> def grouper(iterable, n, fillvalue=None):
...    "Collect data into fixed-length chunks or blocks"
...    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx
...    args = [iter(iterable)] * n
...    return izip_longest(fillvalue=fillvalue, *args)
现在:

现在我们重复同样的步骤:

>>> list(grouper(grouper(li, 3), 2))
[((1, 2, 3), (4, 5, 6)), ((7, 8, 9), (10, 11, 12)), ((13, 14, 15), (16, 17, 18))]
除了我们得到元组的元组,我们需要元组的列表,所以:

>>> li_23 = [list(group) for group in grouper(grouper(li, 3), 2)]

在Python中,应该有一种也是唯一一种显而易见的方法来做事情。那么,是哪一个

  • 第一个需要一个列表或其他序列;第二种方法可以任意选择
  • 如果在末尾有剩余值,则第一个将为您提供一个部分组;第二组是最后一组
  • 第二个很容易修改,删除不完整的最后一个组,而不是填充它,并且不太难修改,为您提供一个部分组;第一个更难修改
  • 第一个对于新手来说更容易理解,但是一旦你了解了这个概念,可能就更难阅读了
  • 其中一个可以很容易地包装到函数中,但第二个已经包装到recipes(或
    more\u itertools
    第三方软件包)中
这些差异中的一个通常会对您的用例产生影响,在这种情况下,最明显的方法就是做您想要做的事情。对于这样的简单情况,如果这些都不重要,请选择您认为更可读的方法。

li = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18]
您可以使用
zip(*[iter(li)]*3)
对项目进行分组:

然后您可以在
zip(*[iter(li)]*3上执行
zip(*[…]*2)

内部项不是列表,因此
将其映射为一:

map(list, zip(*[zip(*[iter(li)]*3)]*2))
#>>> <map object at 0x7f0a5afd80d0>
给定

您可以使用
zip(*[iter(li)]*3)
对项目进行分组:

然后您可以在
zip(*[iter(li)]*3上执行
zip(*[…]*2)

内部项不是列表,因此
将其映射为一:

map(list, zip(*[zip(*[iter(li)]*3)]*2))
#>>> <map object at 0x7f0a5afd80d0>

我个人喜欢这种方法:

>>> li = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18]
>>> 
>>> v = iter(li)
>>> li = [(i, next(v), next(v)) for i in v]  # creates list of tuples
>>> 
>>> v = iter(li)
>>> li = [[i, next(v)] for i in v]  # creates list of lists of tuples
>>> 
>>> li
[[(1, 2, 3), (4, 5, 6)], [(7, 8, 9), (10, 11, 12)], [(13, 14, 15), (16, 17, 18)]]
顺便说一句,如果元素不适合这种结构,这将引发错误,例如,请考虑:

>>> l = [1, 2, 3]
>>> v = iter(l)
>>> 
>>> [(i, next(v)) for i in v]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

参考资料:


    • 我个人喜欢这种方法:

      >>> li = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18]
      >>> 
      >>> v = iter(li)
      >>> li = [(i, next(v), next(v)) for i in v]  # creates list of tuples
      >>> 
      >>> v = iter(li)
      >>> li = [[i, next(v)] for i in v]  # creates list of lists of tuples
      >>> 
      >>> li
      [[(1, 2, 3), (4, 5, 6)], [(7, 8, 9), (10, 11, 12)], [(13, 14, 15), (16, 17, 18)]]
      
      顺便说一句,如果元素不适合这种结构,这将引发错误,例如,请考虑:

      >>> l = [1, 2, 3]
      >>> v = iter(l)
      >>> 
      >>> [(i, next(v)) for i in v]
      Traceback (most recent call last):
        File "<stdin>", line 1, in <module>
      StopIteration
      

      参考资料:


      @jozefg:我尝试了几种使用循环的方法,但它们都没有真正起作用。我对这一切还是新手,所以我不知道有多少方法。我理解,但是stackoverflow更倾向于帮助修复代码,而不是为您编写代码。对于未来的问题,我只提一句建议:)很好luck@jozefg:非常感谢。我不知道。这是我在stackoverflow上的第一个问题……谢谢你纠正我……干杯。@jozefg:我尝试了几种使用循环的方法,但它们都不起作用……我对这一切还是新手,所以我真的不知道那么多方法……我理解,但是stackoverflow在帮助修复代码方面比为你编写代码要好。对于未来的问题,我只提一句建议:)很好luck@jozefg:非常感谢。我不知道。这是我在stackoverflow的第一个问题…谢谢你纠正我…干杯。当然,当然。但是,在期待好的答案之前尝试提出一个好的问题也是如此;)。这实际上是相当可读时,分割超过3里