【问题标题】:Divide a list in the following manner [duplicate]按以下方式划分列表[重复]
【发布时间】:2019-05-25 22:00:58
【问题描述】:

我有这份清单

list=[0,1,2,3,4,2,6]

我想制作另一个这样的元组列表:

list=[(0,1),(1,2),(2,3),(3,4),(4,2),(2,6)]

有没有我可以使用的内置函数?

【问题讨论】:

  • 使用zip
  • 不要使用list作为变量名,它会影响内置的list函数

标签: python list


【解决方案1】:

您可以使用 zip 和列表理解。 listt[1:] 从第二个元素开始。这样做是因为在你的第一对中,你有第一个和第二个元素。 zip 创建对,然后迭代它们并使用 () 将它们存储为元组。

一条建议:不要使用内置名称作为变量。 list 在你的情况下。

listt=[0,1,2,3,4,2,6]

result = [(i) for i in zip(listt, listt[1:])]
# [(0, 1), (1, 2), (2, 3), (3, 4), (4, 2), (2, 6)]

基准性能

根据@prashant rana 的评论,我将zip 的性能与他的方法进行了比较,列表比原始列表长100 万 倍。以下是结果:zip 原来更快

import timeit
listt=[0,1,2,3,4,2,6]*1000000

%timeit [(listt[i],listt[i+1]) for i in range(len(listt)-1)]
%timeit [(i) for i in zip(listt, listt[1:])]

1.76 s ± 178 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
937 ms ± 46.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

【讨论】:

  • 使用 zip 会变慢。
  • 可能是真的,但我假设 OP 没有将它用于生产目的。对于小列表,例如问题,它可以达到目的
  • 我发现它的执行时间是我的执行时间的两倍
  • @prashantrana:检查我的编辑是否有一个比原始列表大 100 万倍的列表。 zip 比你的方法快
  • 是的 zip 确实更快。
【解决方案2】:
[(i, list[idx + 1]) for idx, i in enumerate(list) if idx < len(list) - 1]

[(0, 1), (1, 2), (2, 3), (3, 4), (4, 2), (2, 6)]

【讨论】:

    【解决方案3】:

    没有内置函数,但是 python 可以很容易地制作你自己的函数。给你:

    list = [0, 1, 2, 3, 4, 2, 6]
    x = [(list[i], list[i+1]) for i in range(len(list)-1)]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-18
      • 2021-08-28
      • 2015-05-29
      • 1970-01-01
      • 2014-10-22
      • 2012-06-07
      • 1970-01-01
      • 2020-08-02
      相关资源
      最近更新 更多