当前位置: 首页 > 面试题库 >

如何以完全相同的方式对两个列表(相互引用)进行排序

充鑫鹏
2023-03-14
问题内容

说我有两个清单:

list1 = [3, 2, 4, 1, 1]
list2 = ['three', 'two', 'four', 'one', 'one2']

如果我运行list1.sort(),它将对其进行排序,[1,1,2,3,4]但是还有没有一种list2同步的方法(因此我可以说item4属于'three')?因此,预期输出为:

list1 = [1, 1, 2, 3, 4]
list2 = ['one', 'one2', 'two', 'three', 'four']

我的问题是我有一个非常复杂的程序,可以很好地处理列表,但是我有点需要开始引用一些数据。我知道这对字典来说是一个完美的情况,但是我在处理过程中尽量避免使用字典,因为我确实需要对键值进行排序(如果必须使用字典,我知道如何使用它们)。

基本上,该程序的本质是,数据按随机顺序出现(如上),我需要对其进行排序,处理然后发送结果(顺序无关紧要,但是用户需要知道哪个结果属于哪个结果)键)。我考虑过先将其放入字典中,然后再对列表进行排序,但是如果不保持顺序(如果将结果传达给用户,可能会产生影响),我将无法区分具有相同值的项。因此,理想情况下,一旦获得列表,我宁愿想出一种将两个列表排序在一起的方法。这可能吗?


问题答案:

解决此问题的一种经典方法是使用“装饰,排序,未装饰”习惯用法,使用python的内置zip函数特别简单:

>>> list1 = [3,2,4,1, 1]
>>> list2 = ['three', 'two', 'four', 'one', 'one2']
>>> list1, list2 = zip(*sorted(zip(list1, list2)))
>>> list1
(1, 1, 2, 3, 4)
>>> list2 
('one', 'one2', 'two', 'three', 'four')

这些当然不再是列表,但是如果需要的话,很容易纠正:

>>> list1, list2 = (list(t) for t in zip(*sorted(zip(list1, list2))))
>>> list1
[1, 1, 2, 3, 4]
>>> list2
['one', 'one2', 'two', 'three', 'four']

值得一提的是,以上可能会为简洁而牺牲速度。就地版本,占用3行,在我的机器上,对于较小的列表来说,快了一点:

>>> %timeit zip(*sorted(zip(list1, list2)))
100000 loops, best of 3: 3.3 us per loop
>>> %timeit tups = zip(list1, list2); tups.sort(); zip(*tups)
100000 loops, best of 3: 2.84 us per loop

另一方面,对于较大的列表,单行版本可能会更快:

>>> %timeit zip(*sorted(zip(list1, list2)))
100 loops, best of 3: 8.09 ms per loop
>>> %timeit tups = zip(list1, list2); tups.sort(); zip(*tups)
100 loops, best of 3: 8.51 ms per loop

正如Quantum7指出的那样,[SF的建仍然要快一些,但可能只会更快一些,因为Python内部在所有基于键的排序中使用了完全相同的DSU习惯用法。它只是在接近裸机的地方发生。(这表明zip例程的优化程度如何!)

我认为zip基于方法的灵活性更高,可读性更好,所以我更喜欢它。



 类似资料:
  • 我的问题是,它似乎影响和删除相同的元素从原来的列表!

  • 有时候在设计数据结构的时候,可能会遇到两个类需要相互引用的情形。比如类A有类型为B的成员,而类B又有类型为A的成员。 那么这种情形下,两个类的设计上需要注意什么呢? 同一文件 尝试方案 将A和B的定义都放在一个文件中,例如: #include <iostream> class A { public: A() { aa_ = 'A'; } char aa_;

  • 问题内容: 我有两个并且彼此相关,例如,与“ e1.jpg”相关的“ H1.txt”。如何imgList根据的随机化自动对列表进行随机化?像在excel中一样,如果我们对某些列进行排序,其他列是否会自动跟随? 随机化后输出,例如: 预期的输出: 问题答案: 使用Collections.shuffle()两次,并Random用相同的种子初始化两个对象: 使用具有相同种子的两个对象可确保两个列表将以完

  • 问题内容: 我想知道用Python方式通过两个键对元组列表进行排序的方式,从而用一个(只有一个)键进行排序将是相反的顺序,而用另一个键进行排序将是不区分大小写的。更具体地说,我有一个包含元组的列表,例如: 我可以使用以下代码对它们进行两个键排序: 要以相反的顺序排序,我可以使用 但这会用两个键以相反的顺序排序。 任何提示,不胜感激。 问题答案: 当我们需要对具有两个约束的列表进行排序时,将使用两个

  • 问题内容: 在此系统中,我们存储产品,产品图像(产品可能有很多图像)和产品的默认图像。数据库: 如您所见,和,是循环参考。可以吗 问题答案: 不,那不行。表之间的循环引用是混乱的。请参阅这篇(已有十年的历史)文章:SQL By Design:循环参考 一些DBMS可以特别小心地处理这些问题,但是MySQL会遇到问题。 作为您的设计,第一选择是使两个FK之一为可空。这使您能够解决“鸡与蛋”问题(我应

  • 问题内容: 我有一个从控制器传递到JSP的Player对象的列表,我想以几种不同的方式在同一页面上显示它们: 按名称排序的菜单 按赢/输百分比排序的列表 我可以在模型中放置单独的排序后的副本,但是处理显示相同列表的不同方法似乎更像是视图的责任,因此,我希望避免将逻辑放入控制器中。我已经有几个实现Comparator的类来帮助实际排序。 在JSP中执行此操作的最佳方法是什么? 我可以在将列表传递到其