【问题标题】:Combining Indices of Two Sorted Lists to Form a Third SuperSorted List组合两个排序列表的索引以形成第三个超排序列表
【发布时间】:2016-09-01 03:07:23
【问题描述】:

我有两个列表 ['AAPL', 'MMM', 'AMAT']['AMAT', 'AAPL', 'MMM'],我想根据每个字符串在其各自列表中的位置创建第三个列表。

例如: AAPL 第 1 名 + 第 2 名 = 共 3 个,MMM 第 2 和第 3 名 = 共 5 个,AMAT 第 1 和第 3 名 = 共 4 个。

最终列表将是(通过减少累积位置)['AAPL', 'AMAT', 'MMM']

我什至不知道从哪里开始。

【问题讨论】:

  • 领带应该如何处理?
  • 我认为不会有联系。名单很长。但如果有,最有效的解决方案将是最好的。如果出现平局,哪个先到并不重要。

标签: python list


【解决方案1】:

您可以使用字典来保存带有索引总和的项目,然后根据索引创建预期的列表:

>>> from collections import defaultdict
>>> 
>>> d = defaultdict(int)
>>> 
>>> for (ind1, j), (ind2, t) in zip(enumerate(a), enumerate(b)):
...     d[j] += ind1
...     d[t] += ind2
...  
>>> sorted(d.keys(), key=lambda x: d[x])
['AAPL', 'AMAT', 'MMM']

如果列表的长度不同,您可以使用itertools.zip_longet(在python2 中izip_longest)来zip 枚举对象。

【讨论】:

  • 或者您可以只使用enumerate 并分别循环遍历两个列表,而不是使用任何类型的zipping。
  • @user2357112 是的,如果可读性比性能更重要的话。
  • 我认为单独循环列表不会对性能造成任何影响。
  • enumerate(zip(a, b)) 怎么样?
  • 我喜欢这个……有点。它的晦涩程度几乎类似于 Perl。
【解决方案2】:

只取一个并按累积位置排序。

>>> a, b = ['AAPL', 'MMM', 'AMAT'], ['AMAT', 'AAPL', 'MMM']
>>> sorted(a, key=lambda x: a.index(x) + b.index(x))
['AAPL', 'AMAT', 'MMM']

【讨论】:

  • @Kasramvd 如果他们可以有所不同,那么他们的示例肯定会表明这一点,并且他们会指定如何处理。
  • 为此,项目总是转为字符串。这种排序函数如何支持大量元素——在 1000 秒的规模上?
  • @345243lkj 试试看?
  • @StefanPochmann 后期跟进:是否有任何简单的修改可以打印出具有该排名总和的列表?类似['AAPL' 3, 'AMAT 4, 'MMM' 5]
  • @345243lkj 抱歉,我不明白那种格式,尤其是为什么AMAT 后面没有'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-26
  • 1970-01-01
  • 2015-05-12
  • 2013-11-10
  • 1970-01-01
  • 1970-01-01
  • 2010-10-02
相关资源
最近更新 更多