如何 "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] 应该是领导者。你明白我的意思。
问题是如何实现。
我可以通过枚举索引 a 来命名哪些是领导者,但这是非常“业余”的方式,只打印每周的领导者。我每次都无法记下哪些实际上是领导者的分数,以及他们相应的索引。
我还可以创建一个名为 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()
我们有一群人。他们每周随机分配一个从 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] 应该是领导者。你明白我的意思。 问题是如何实现。
我可以通过枚举索引 a 来命名哪些是领导者,但这是非常“业余”的方式,只打印每周的领导者。我每次都无法记下哪些实际上是领导者的分数,以及他们相应的索引。
我还可以创建一个名为 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()