【问题标题】:How to "filter" out a list in Python , without losing the index如何在不丢失索引的情况下在 Python 中“过滤”出列表
【发布时间】:2021-03-07 04:16:30
【问题描述】:

我们有一群人。他们每周被随机分配一个从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. 我还可以创建一个名为领导者的新列表。我将遍历人员列表,如果元素的值为 9 及以上,它将在新列表后面附加 1(领导者)或 0(非领导者),并有类似
    leaders1 = [0,0,0,0,0,0,0,0,0,1], @ 987654327@,每次只打印值为1的,并与之前的leader列表进行比较,可能会实现一个计数器(?)。

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

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

谢谢。

【问题讨论】:

  • 写作业的创意越来越好,SO不是编程服务
  • 如果您遇到非常具体的情况,请粘贴您的代码并指出问题。如果没有,有类似搜索、在编程子版块或论坛中提问之类的东西可以为您提供帮助。虽然我觉得你甚至还没有开始写作业。
  • 这不是家庭作业。我是自学语言,并通过 Youtube 视频尝试示例和想法。如果您认为这是我正在寻找的,您可以在一年后提醒并回答我。另外,我并没有要求你在代码中给出答案,而是要求你知道什么是最好的。

标签: python python-3.x modeling representation


【解决方案1】:

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

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

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

也许使用class Person 对问题进行建模,该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()

【讨论】:

  • 这就是为什么我认为我不是为代码而生的(也是我放弃 Java 的原因)。虽然您的回答比我的进步更先进,但我真的很了解这种方法。这就是我想学习思考事物的方式!很有见地!谢谢!谢谢!
  • 非常欢迎您。有时,在学习过程的某些阶段,您需要获得执行某些操作的权限……这个问题可以通过列表、索引和过滤来解决……但是您必须探索其他方法。 class Person 仍然使用索引作为每个 Person 的唯一 ID;显然,这来自问题的原始表述;你可以修改类,并处理抽象(我鼓励你这样做);例如,Person 可以具有与其在列表中的位置无关的名称和 ID 号...
  • 可以,可以解决。根据我的第二个解决方案,我本可以做到,并且实际上做到了,尤其是对于 new lists 。这将是一个答案。一些评论者指责我做作业,但如果是作业,我可以立即提供解决方案 2,并完成它。但作为一名 37 岁的自动化工程师,我想自学成才,我想从基本面出发。我想学会更开放地思考,这样我就可以在我的工作中实施这种思维方式。我不想只使用 PLC 和 Scada,即使我不确定我是否能够编程。谢谢!!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-10
  • 1970-01-01
  • 2023-03-08
  • 2019-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多