【问题标题】:Custom re-arrange list using python使用python自定义重新排列列表
【发布时间】:2021-10-04 02:36:11
【问题描述】:

我有以下清单:

lst = ['A', 'B', 'C','D', 'E', 'F', 'G', 'H','I','J', 'K', 'L','M','N','O']

我想对列表进行排序,使得每第六个元素都在第五个值之后,第十一个在第二个之后,第二个在第三个之后,依此类推。该列表应具有以下输出:

['A', 'F', 'K', 'B', 'G', 'L', 'C', 'H', 'M', 'D', 'I', 'N', 'E', 'J', 'O']

到目前为止我尝试了什么?

lst = ['A', 'B', 'C','D', 'E', 'F', 'G', 'H','I','J', 'K', 'L','M','N','O']
new_lst = [lst[0], lst[5], lst[10], lst[1], lst[6], lst[11], lst[2], lst[7], lst[12], lst[3], lst[8], lst[13] , lst[4], lst[9], lst[14]]
new_lst

这提供了所需的输出,但我正在寻找最佳脚本。我该怎么做?

【问题讨论】:

  • 你说“每个第六个元素都在第五个值之后”,但是你想要'F'(第六个元素)before'E'(第五个元素) ?您的描述/示例对我来说毫无意义。
  • 第六个元素应该是第二个元素,第十一个元素应该是第三个元素,以此类推。

标签: python list sorting indexing


【解决方案1】:

从图案中,重塑为 2d,然后转置和展平

sum 是一个方便的函数,你可以在其中提到起点,在这种情况下,标识是 () 或 [],具体取决于类型

### sol 1
import numpy as np
print('Using numpy')
x = ['A', 'B', 'C','D', 'E', 'F', 'G', 'H','I','J', 'K', 'L','M','N','O']
np.array(x).reshape((-1, 5)).transpose().reshape(-1)
# array(['A', 'F', 'K', 'B', 'G', 'L', 'C', 'H', 'M', 'D', 'I', 'N', 'E', 'J', 'O'], dtype='<U1')

# Sol 2
print('One more way without numpy')
list(
    sum(
        zip(x[:6], x[5:11], x[10:]),
        ()
    )
)

# Sol 3
print('One more way without numpy')
sum(
    [list(y) for y in zip(x[:6], x[5:11], x[10:])],
    []
)

# Sol 4
print('One more way without numpy')
list(
    sum(
        [y for y in zip(x[:6], x[5:11], x[10:])],
        ()
    )
)

【讨论】:

  • 这给了我一个好主意。感谢您的帮助!
  • 最近才知道求和很方便。在我误解之前 sum 只能用于带有数字条目的列表
  • @DanielHao 可以用zip做,请再看一遍
  • 好的解决方案,但您应该尝试使答案更易于阅读(分开不同的方法)并使其更容易复制粘贴,例如删除&gt;&gt;&gt;
【解决方案2】:

如果您想避免使用库,也可以使用列表推导:

lst = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O']

[x for t in zip(lst[:6], lst[5:11], lst[10:]) for x in t]

# ['A', 'F', 'K', 'B', 'G', 'L', 'C', 'H', 'M', 'D', 'I', 'N', 'E', 'J', 'O']

【讨论】:

  • 感谢您的帮助
【解决方案3】:

如果你想让它在当前之后的每第五个和第十个元素重复一次,那么它会是

# Must consist of at least 14 values
input_list = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O']

output_list = []
for i in range(len(t) // 3):
    output_list.append(t[i])
    output_list.append(t[i + 5])
    output_list.append(t[i + 10])

print(output_list)

未使用任何库。它会给出想要的结果:

['A', 'F', 'K', 'B', 'G', 'L', 'C', 'H', 'M', 'D', 'I', 'N', 'E', 'J', 'O']

【讨论】:

  • 只需要确保 len(t) // 3 + 10 存在。
  • 感谢您的帮助!这里,t 是 input_list 对吧?
  • @disukumo 是的。也查看 root163 的答案。有几个使用zip() 的便捷单行代码。
猜你喜欢
  • 2015-02-09
  • 2012-08-04
  • 1970-01-01
  • 2022-10-05
  • 1970-01-01
  • 2020-07-09
  • 2021-11-09
  • 2015-09-16
  • 1970-01-01
相关资源
最近更新 更多