检查列表列表中的重复项并对其进行排序

时间:2018-03-12 05:47:48

标签: python

我有一张包含以下内容的表:

.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]]

代码没有达到我想要的输出,我希望得到一些帮助。

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]]