亲爱的,我有几个相互依赖的列表,例如在一个列表中我有一个代码,在另一个列表中我有该代码的日期。我的问题是我必须添加一个新的代码列表,就像您的日期列表一样。我的目的是创建一个按时间顺序排列的日期列表,但保持相对于其代码列表的位置。
我所做的是在末尾粘贴新的日期列表和新的代码列表,留下一个大的代码列表和另一个大的日期列表,如下所示:
for i in range(len(codigo2)): #Union lista principal FDE, Fecha y Status
CODIGOS.append(codigo2[i])
FECHAS.append(fechas2[i])
但是这样做会丢失时间顺序,因为我只是将新代码和日期添加到末尾。他们知道一种对列表进行排序并将这些新位置保留在另一个列表中的方法。
定义一个类
Entrada
然后,如果您有两个包含条目的列表,您可以按如下方式混合和排序它们
如果两个列表的位置匹配,即 中的代码
CODIGOS[x]
对应 中的日期FECHAS[x]
,则可以使用zip
:Jorge,以下代码解释了我的评论,并为您的问题提供了解决方案。我同意@FjSevilla,如果您已经在使用
pandas
,为什么将数据转换为列表然后进行排序?pandas
提供了很多可操作的功能dataframes
,您可能需要在这方面进行调查,如果没有,这肯定可以帮助您这是输出:
请注意,每个“代码”对应于“日期”中的日期。通过对“日期”进行排序,我们失去了“同步”,就像您在 Excel 中按一列排序而忘记指出其他列一样。解决方案是维护一个允许“代码”和“日期”相关的数据结构。一种可能性是使用“元组”,这样:您
tuplelist = [e for e in zip(codigo, fechas)]
将两个列表转换为另一个元组列表,例如[(codigo, fecha), (codigo, fecha),...]
. 使用这种结构,您已经可以做到:tuplelist.sort(key=lambda tuplelist: tuplelist[1])
按日期对所有内容进行排序(第 2 列)。最后,如果您想将所有内容保留为原始列表,您只需执行“解压缩”:正如我告诉过你的,可以使用Schwartzian 变换,尽管这个想法来自 Python 中的 Perl,但可以使用
zip
.这个想法很简单,它用于
zip
获取元素对并应用于它们sorted
。这给了我们一个列表,其中包含按传递给的第一个迭代排序的对zip
(如果此元素相等,则使用下一个元素)。完成后,我们解包由返回的列表并将
sorted
其所有元素作为参数传递,以zip
返回使用元组的元素获得两个列表。*
在 Python 中,您可以在其前面使用解压可迭代对象。唯一复杂的是要理解 的操作
zip
,我认为用几个例子可以比用文字更好地解释:zip(*c)
它相当于:如何根据您的代码使用上述想法进行排序的示例:
离开:
如果您注意到使用
list.extend
连接列表,请考虑在您的代码中使用它而不是您现在使用的for
y循环append
。