Python中如何按timing索引对多索引列表排序并关联对应元素?
按timing排序并保持关联元素对应,同时优化数据结构建议
错误原因说明
你之前的代码报错是因为sorted(EVENTS)是把整个EVENTS里的三个子列表当成独立元素来排序,排序时会拿每个子列表的第一个元素做比较——第一个子列表的第一个元素是浮点数,第二个子列表的第一个元素是字符串,Python没法直接比较浮点数和字符串,所以抛出了'<' not supported between instances of 'str' and 'float'的错误,这完全偏离了你想要的「按timing子列表排序并关联其他元素」的逻辑。
解决方法
要实现需求,核心是把三个子列表中位置对应的元素绑定在一起,排序后再拆分回原来的结构。具体代码如下:
EVENTS = [ [2.55800009, 1.88999999],['Left', 'Left'], ['Foot Strike', 'Foot Off']] # 打包对应位置的元素:(timing, side, label) zipped = list(zip(*EVENTS)) # 按timing升序排序 sorted_zipped = sorted(zipped, key=lambda x: x[0]) # 拆分回原来的结构并转成列表 EVENTS_SORTED = [list(item) for item in zip(*sorted_zipped)] print(EVENTS_SORTED) # 输出:[[1.88999999, 2.55800009], ['Left', 'Left'], ['Foot Off', 'Foot Strike']]
更合适的数据结构建议
你当前的嵌套列表结构很难直观体现三个子列表元素的对应关系,推荐几种更清晰的结构:
- 字典列表:每个事件用一个字典存储,属性关联一目了然:
events = [ {'timing': 2.55800009, 'side': 'Left', 'label': 'Foot Strike'}, {'timing': 1.88999999, 'side': 'Left', 'label': 'Foot Off'} ] # 直接按timing字段排序 events_sorted = sorted(events, key=lambda x: x['timing'])
- dataclass(Python 3.7+):用类定义事件结构,规范且易读:
from dataclasses import dataclass @dataclass class Event: timing: float side: str label: str events = [ Event(2.55800009, 'Left', 'Foot Strike'), Event(1.88999999, 'Left', 'Foot Off') ] events_sorted = sorted(events, key=lambda x: x.timing)
- Pandas DataFrame:处理大量数据时效率更高,支持丰富的排序、筛选操作:
import pandas as pd df = pd.DataFrame({ 'timing': [2.55800009, 1.88999999], 'side': ['Left', 'Left'], 'label': ['Foot Strike', 'Foot Off'] }) df_sorted = df.sort_values('timing') # 转回你需要的嵌套列表结构 events_sorted = [df_sorted['timing'].tolist(), df_sorted['side'].tolist(), df_sorted['label'].tolist()]
内容的提问来源于stack exchange,提问作者IVM
相关产品推荐
相关产品推荐

