我有一张包含以下内容的表:
.as-console-wrapper { max-height: 100% !important; top: 0; }
和每个列表中表示的第一个值(5,4,3,2,1)可以说是一个人的ID。表示的第二个值(7,3,3,3,3)将是一个分数。我尝试做的是检测第二列中的重复值,在这种情况下是列表中的3。因为4个列表的第3个值为3,所以我现在想根据第一个值对它们进行排序。
在表中,注意[1,3]有一个作为第一个值因此,它应该替换表中的[4,3]位置。 [2,3]应该取代[3,3]作为回报。
table = [[5, 7],[4, 3],[3, 3],[2, 3],[1, 3]]
我试过了:
Expected output: [[5,7],[1,3],[2,3],[3,3],[4,3]]
代码没有达到我想要的输出,我希望得到一些帮助。
答案 0 :(得分:6)
您可以将sorted
与密钥一起使用。
table = [[5, 7], [4, 3], [3, 3], [2, 3], [1, 3]]
# Sorts by second index in decreasing order and then by first index in increasing order
sorted_table = sorted(table, key=lambda x: (-x[1], x[0]))
# sorted_table: [[5, 7], [1, 3], [2, 3], [3, 3], [4, 3]]
答案 1 :(得分:1)
您应该按第二列对整个列表进行排序,使用第一列来断开关系。这具有正确地对三个组进行分组的优点,即使七个被插入它们之间,例如,
之类的东西table = [[4, 3],[3, 3],[5, 7],[2, 3],[1, 3]]
在Python中,你可以用一行代码来完成:
result = sorted(table, key=lambda x: (-x[1], x[0]))
如果您想进行就地排序,请执行
table.sort(key=lambda x: (-x[1], x[0]))
在这种情况下你可以做的另一件好事是依靠Python排序算法的稳定性。 The docs实际上建议在这样的复杂情况下按照与键相反的顺序进行多种排序。使用operator
中的函数可能会加速代码:
from opetator import itemgetter
result = sorted(table, key=itemgetter(0))
result.sort(key=itemgetter(1), reversed=True)
第一种排序将以正确的顺序排列ID。第二个将按分数排序,按降序排列,因为排序稳定,所以ID不会受到相同分数的影响。
答案 2 :(得分:0)
如果你想保持列表项与非重复的第二个元素不变,并且能够处理多个第二个项可以重复的情况,我认为你需要的不仅仅是内置的{{1 }}
说出您的列表是:table = [[5, 7], [6, 1], [8, 9], [3, 1], [4, 3], [3, 3], [2, 3], [1, 3]]
它不会触及项[5, 7]
和[8, 9]
,但会根据其第二个元素对其余项目进行排序。结果将是:
[[5, 7], [3, 1], [8, 9], [6, 1], [1, 3], [2, 3], [3, 3], [4, 3]]
以下是代码:
def secondItemSort(table):
# First get your second values
secondVals = [e[1] for e in table]
# The second values that are duplicate
dups = [k for k,v in Counter(secondVals).items() if v>1]
# The indices of those duplicate second values
indices = dict()
for d in dups:
for i, e in enumerate(table):
if e[1]==d:
indices.setdefault(d, []).append(i)
# Now do the sort by swapping the items intelligently
for dupVal, indexList in indices.items():
sortedItems = sorted([table[i] for i in indexList])
c = 0
for i in range(len(table)):
if table[i][1] == dupVal:
table[i] = sortedItems[c]
c += 1
# And return the intelligently sorted list
return table
让我们测试更复杂的table
:
table = [[5, 7], [6, 1], [8, 9], [3, 1], [4, 3], [3, 9], [3, 3], [2, 2], [2, 3], [1, 3]]
应留在其所在位置的物品:[5, 7]
和[2, 2]
。
应交换的项目:
[6, 1]
和[3, 1]
。
[8, 9]
和[3, 9]
[4, 3], [3, 3], [2, 3], [1, 3]
<强>击鼓声... 强>
In [127]: secondItemSort(table)
Out[127]:
[[5, 7],
[3, 1],
[3, 9],
[6, 1],
[1, 3],
[8, 9],
[2, 3],
[2, 2],
[3, 3],
[4, 3]]