这是一个问题,是什么是识别列表中连续重复项的最 Pythonic 方式的扩展?.
假设您有一个元组列表:
my_list = [(1,4), (2,3), (3,2), (4,4), (5,2)]
然后按每个元组的最后一个值对其进行排序:
my_list = sorted(my_list, key=lambda tuple: tuple[1])
# [(3,2), (5,2), (2,3), (1,4), (4,4)]
然后我们有两个连续的运行(查看每个元组中的最后一个值),即[(3,2), (5,2)]
和[(1,4), (4,4)]
。
反转每次运行的pythonic方式是什么(不是里面的元组),例如
reverse_runs(my_list)
# [(5,2), (3,2), (2,3), (4,4), (1,4)]
这可以在发电机内完成吗?
更新
我注意到示例列表可能不清楚。因此,请考虑:
my_list = [(1,"A"), (2,"B"), (5,"C"), (4,"C"), (3,"C"), (6,"A"),(7,"A"), (8,"D")]
理想的输出来自reverse_runs
哪里
[(7,"A"), (6,"A"), (1,"A"), (2,"B"), (3,"C"), (4,"C"), (5,"C"), (8,"D")]
为了明确术语,我采用了“运行”来描述TimSort
Python 的排序函数所基于的内容——赋予它(排序函数)它的安全性。
因此,如果您对集合进行排序,如果集合是多面的,则仅对指定的维度进行排序,如果指定维度的两个元素相同,则它们的排序将不会改变。
因此以下功能:
sorted(my_list,key=lambda t: t[1])
产量:
[(1, 'A'), (6, 'A'), (7, 'A'), (2, 'B'), (5, 'C'), (4, 'C'), (3, 'C'), (8, 'D')]
"C"
并且(即)上的运行(5, 'C'), (4, 'C'), (3, 'C')
不受干扰。
所以总而言之,来自尚未定义的函数的期望输出reverse_runs
:
1.) 按元组的最后一个元素对元组进行排序
2.) 保持第一个元素的顺序,在最后一个元素上反向运行
理想情况下,我希望在生成器函数中使用它,但这(目前对我来说)似乎是不可能的。
因此,可以采用以下策略:
1.)通过最后一个元素对元组进行排序sorted(my_list, key=lambda tuple: tuple[1])
2.) 当后续元组 (i+1) 与 (i) 中的最后一个元素不同时,识别每个元组中最后一个元素的索引。即识别运行
3.)制作一个空列表
4.) 使用拼接运算符,获取、反转并将每个子列表附加到空列表