【问题标题】:List ascending multiple times - split to individual lists [duplicate]列表多次升序-拆分为单个列表[重复]
【发布时间】:2020-12-19 08:56:18
【问题描述】:

对于以下列表:

races=['R1', 'R2', 'R3', 'R4', 'R1', 'R2', 'R1', 'R2', 'R3', 'R4', 'R5']

我想把它分为:

list_1=['R1', 'R2', 'R3', 'R4']
list_2=['R1', 'R2']
list_3=['R1', 'R2', 'R3', 'R4', 'R5']

所以 - 在使用列表推导时,只要“R”数字开始下降,就会开始一个新列表。 我对 list_1 的尝试是:

list_1=[i for i in races if int(i.split('R')[1])>int((i-1).split('R')[1])]

这不太行 - 加上如何处理 list_2 和 list_3?

【问题讨论】:

标签: python list list-comprehension


【解决方案1】:

如果您尝试使用列表推导式,您会变得更加复杂。显式循环实现了一个简单的解决方案:

races = ['R1', 'R2', 'R3', 'R4', 'R1', 'R2', 'R1', 'R2', 'R3', 'R4', 'R5']

out = []

for r in races:
    if not out or r < out[-1][-1]:
        out.append([])
    out[-1].append(r)

print(out)

给予:

[['R1', 'R2', 'R3', 'R4'], ['R1', 'R2'], ['R1', 'R2', 'R3', 'R4', 'R5']]

请注意,实际拆分为单个变量需要执行一些“hacky”操作(例如使用globalsexec)。将输出保存在一个集合中,如本示例所示,并根据需要进行索引。

但是,在输出变量的数量已知的特殊情况下,您可以将其解包:

list_1, list_2, list_3 = out

【讨论】:

  • Alani - 非常感谢。所以 - 在第一次通过这个循环时:r = R1 和 out[-1][-1] = nothing('out' 列表中还没有任何内容)......所以很困惑:r
  • @AngusStevenson 查看or 的短路评估 - 因为not out 评估Trueout[-1][-1] 从未在该迭代中评估。 (是的,它抛出一个错误如果它被评估了。)
  • 非常感谢 Alani - 我会查一下。
猜你喜欢
  • 1970-01-01
  • 2018-05-26
  • 2012-12-04
  • 2017-06-16
  • 1970-01-01
  • 2019-06-28
  • 2017-04-25
  • 2017-04-16
  • 2012-10-20
相关资源
最近更新 更多