在新列表Python / Django中添加的特定排序元素

时间:2016-07-19 13:17:51

标签: python django sorting populate

我有这个:

[
[{ 'position': 1,  'user_id': 2,  'value': 4, 'points': 100}],
[{ 'position': 2,  'user_id': 6,  'value': 3, 'points': 88}],
[{ 'position': 3,  'user_id': 5,  'value': 2, 'points': 77}],
[{ 'position': 4,  'user_id': 7,  'value': 1, 'points': 66}],
[{ 'position': 5,  'user_id': 3,  'value': 1, 'points': 9}],
[{ 'position': 6,  'user_id': 11, 'value': 0,  'points': 9}],
[{ 'position': 7,  'user_id': 1,  'value': 0, 'points': 3}],
[{ 'position': 8,  'user_id': 10, 'value': 0,  'points': 3}],
[{ 'position': 9,  'user_id': 4,  'value': 0, 'points': 2}],
[{ 'position': 10,  'user_id': 8, 'value': 0,  'points': 2}]
]

按点组织。 我们的想法是选择user_id并生成一个包含所选5个用户的新列表。

实施例

USER_ID = 3:

[{ 'position': 3,  'user_id': 5,  'value': 2, 'points': 77}],
[{ 'position': 4,  'user_id': 7,  'value': 1, 'points': 66}],
[{ 'position': 5,  'user_id': 3,  'value': 1, 'points': 9}],
[{ 'position': 6,  'user_id': 11, 'value': 0,  'points': 9}],
[{ 'position': 7,  'user_id': 1,  'value': 0, 'points': 3}]

它返回中间的user_id 3,其中2个用户高,2个用户低

USER_ID = 2

[{ 'position': 1,  'user_id': 2,  'value': 4, 'points': 100}],
[{ 'position': 2,  'user_id': 6,  'value': 3, 'points': 88}],
[{ 'position': 3,  'user_id': 5,  'value': 2, 'points': 77}],
[{ 'position': 4,  'user_id': 7,  'value': 1, 'points': 66}],
[{ 'position': 5,  'user_id': 3,  'value': 1, 'points': 9}],

由于user_id没有更高的用户,因此返回4个较低的用户。所以总是一样的逻辑。

USER_ID = 9:

[{ 'position': 6,  'user_id': 11, 'value': 0,  'points': 9}],
[{ 'position': 7,  'user_id': 1,  'value': 0, 'points': 3}],
[{ 'position': 8,  'user_id': 10, 'value': 0,  'points': 3}],
[{ 'position': 9,  'user_id': 4,  'value': 0, 'points': 2}],
[{ 'position': 10,  'user_id': 8, 'value': 0,  'points': 2}]

on user_id = 9我们只有1个用户较低,因此我们添加了3个更高的用户

例如,如果列表中只有2个用户,则应返回该2个用户。 主要规则: 如果我们有5个或更多用户,则返回5个用户。 如果我们有4个用户,则返回4个用户

如何做到这一点的好方法? 感谢

1 个答案:

答案 0 :(得分:1)

这基本上只是my answeryour original question的更新。

a = [
    [{ 'position': 1,  'user_id': 2,  'value': 4, 'points': 100}],
    [{ 'position': 2,  'user_id': 6,  'value': 3, 'points': 88}],
    [{ 'position': 3,  'user_id': 5,  'value': 2, 'points': 77}],
    [{ 'position': 4,  'user_id': 7,  'value': 1, 'points': 66}],
    [{ 'position': 5,  'user_id': 3,  'value': 1, 'points': 9}],
    [{ 'position': 6,  'user_id': 11, 'value': 0,  'points': 9}],
    [{ 'position': 7,  'user_id': 1,  'value': 0, 'points': 3}],
    [{ 'position': 8,  'user_id': 10, 'value': 0,  'points': 3}],
    [{ 'position': 9,  'user_id': 4,  'value': 0, 'points': 2}],
    [{ 'position': 10,  'user_id': 8, 'value': 0,  'points': 2}]
]

# Sort it if not already sorted
# a.sort(key=lambda x: x[0]['position'])

def find_index(l, user_id):
    i = 0
    while l[i][0]['user_id'] != user_id:
        i += 1
    return i

def get_subset(l, i):
    return l[:(i + 1 + max(2, 4 - i))][-5:]

get_subset(a, find_index(a, 3))