【问题标题】:Specific Sort of elements to add in new list Python/Django要添加到新列表 Python/Django 中的特定元素排序
【发布时间】:2016-11-22 10:08:06
【问题描述】:

我有这个:

[
[{ '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}]

在 user_id=9 上,我们只有 1 个较低的用户,所以我们添加了 3 个较高的用户

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

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

【问题讨论】:

  • 这和this one是同一个问题。你只是重新制定了它。
  • 是的,我不得不更改一些以前的代码
  • 您为什么不编辑您的问题而不是创建一个新问题?
  • 思想现在更容易理解了,其他的答案我认为会断章取义

标签: python django sorting populate


【解决方案1】:

这基本上只是将my answer更新为your 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))

【讨论】:

  • 它有一些错误@Antoine。我使用了 get_subset(a, find_index(a, 3)) 并且我在新列表的最后位置获得了 user_id。应该在中间。
  • 另外,如果我选择 user_id=2 ,它只会返回列表中的 4 个元素。
  • 是的,转换错误,抱歉,应该修复。
猜你喜欢
  • 2018-08-31
  • 1970-01-01
  • 2019-01-29
  • 2018-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-03
  • 1970-01-01
相关资源
最近更新 更多