如何 "filter" 在 Python 中列出一个列表,而不丢失索引

How to "filter" out a list in Python , without losing the index

我们有一群人。他们每周随机分配一个从 0 到 10 的数字,如果数字大于 9,则他们成为领导者。如果他们超过 1 人,他们都成为领导者,如果他们没有,他们自己投票选举领导者.一个人不能连续担任领导超过2次。

无论如何,让我们只有 10 个人并给出一些随机数,对于这个问题:

import random

people=[]
for i in range(10):
    inputval = random.randint(0,10)
    people.append(inputval)

print(people)

所以我们得到:

[5, 6 ,7, 4, 8, 3, 6, 7, 8, 9 ]

所以,这些是符合人们的价值观。

人[0] = 5,人[1] = 6 等等...

领导者是人[9]

下周,我们有

people = [8, 4 ,3, 2, 6, 10, 7, 6, 1, 9 ]

所以领导者是人[5]和人[9]

下周我们有:

people = [9, 0 ,4 , 8, 7, 6, 2, 3 , 1, 9 ]

所以领导者应该是 people[0] 和 people[9],但是 people[9] 已经连续 2 次成为领导者,所以只有 people[0] 应该是领导者。你明白我的意思。 问题是如何实现。

  1. 我可以通过枚举索引 a 来命名哪些是领导者,但这是非常“业余”的方式,只打印每周的领导者。我每次都无法记下哪些实际上是领导者的分数,以及他们相应的索引。

  2. 我还可以创建一个名为 leaders 的新列表。我将 运行 遍历人员列表,如果元素的值为 9 及以上,它将在新列表中附加 1(领导者)或 0(对于非领导者),并具有类似
    leaders1 = [0,0,0,0,0,0,0,0,0,1], leaders2=[0,0,0,0,0,1,0,0,0,1], 每次只打印出值为1的那些,并与之前的leader列表进行比较,大概实现一个计数器(?)。

我发现它在长 运行 中更复杂,特别是如果我想 运行 这个方法很多周,从而创建越来越多的列表来比较。

最好的解决方案是什么?有什么方法可以过滤掉领导者,而不会丢失人员索引,例如 [5]、[9] 等?也许解决方案根本不应该使用列表?

谢谢。

您遇到的问题是表示
您将其呈现为“如何过滤列表”,但实际上,问题是如何确定遵循一组严格规则分配的连续领导者。

可能有非常聪明的方法可以用列表或二进制数来表示它,并进行位移操作...这是计算机科学先驱的遗产,他们不得不用非常有限的内存和非常有限的方式做事计算机能力...

您很可能没有这个问题,因此您可以用一种可理解的方式来表达您的问题,并让代码极简主义的滑稽动作留给怀旧和代码高尔夫。

也许可以使用 class Person 对问题进行建模,它保留作为领导者的连续分数和任命的历史记录,并且能够自行确定它当前是否有资格成为领导者?

import random


class Person:
    """stores a score, and a history of leadership, that allows it
    to decide if it qualifies a the current leader.
    """
    def __init__(self, ndx):
        self.ndx = ndx
        self.score_history = []
        self.leadership_history = []
    def add_new_score(self, score):
        self.score_history.append(score)
        self.current_leader()
    def current_leader(self):
        if self.score_history[-1] >= 9:
            current_leader = True
        else:
            current_leader = False
        if current_leader and len(self.score_history) >= 3:
            if self.leadership_history[-2] and self.leadership_history[-1]:
                current_leader = False
        self.leadership_history.append(current_leader)
    def is_current_leader(self):
        return self.leadership_history[-1]
    
def assign_score(people):
    for p in people:
        p.add_new_score(random.randint(0, 10))
        print(p.score_history[-1], end=' ')
    print()
        
def get_leaders(people):
    for p in people:
        if p.is_current_leader():
            print(p.ndx, end=' ')
    print()
    
people = [Person(idx) for idx in range(10)]
print()
for _ in range(20):
    print(_, end='\n')
    assign_score(people)
    get_leaders(people)
#     input()
    print()