繁体   English   中英

通过索引列表检查索引

[英]Checking index through a list of indexes

我有以下清单:

lst = [['dad','50',1],['brother','20',1],['mom','30',1],['sister','10',1],['dad','50',2],['brother','20',2],['mom','30',2],['sister','10',2]]

我试图选择一个家庭(用1或2表示),然后将年龄与该家庭成员的年龄进行比较,以找出最高的家庭。 我能够区分这些家庭并找到最老的家庭,但是我无法显示该家庭成员的角色,因为在此过程中,他的年龄不再与他的名字相关联。 下面,如果家庭是第一个,则该程序应检查并比较他们的年龄,并打印出他在家庭中的角色。

age =[]
for i in range(len(lst)):
        if lst[i][2] == "1": # checking thats its family 1
            age.append(int(lst[i][1])) # creates lists of all ages in fam 1

    m = max(age)
    m = str(m) # finds the oldest

从这里开始,我想不出一种方法来将最早的链接回它的行,以便我可以打印它。 有什么帮助吗? 干杯!!

您可以将按键功能与max

people =[]
for i in range(len(lst)):
    if lst[i][2] == "1": # checking thats its family 1
        people.append(lst[i])

eldest = max(people, key=lambda x: int(x[1]))

eldest包含代表您数据结构中某个人的值的完整列表。

还值得注意的是,您的数据和代码可能不一致。 例如,第二个索引(家庭ID号)是一个整数,但是您正在测试字符串的成员资格。 您的年龄也被编码为字符串,这就是为什么我的键函数将其强制转换为整数。

您可以(A)存储带有年龄的姓名,然后在需要时随身携带,或者(B)返回并找到具有所需年龄的人。 这是(B)的示例:

# your for loop
for ...

# outside of your for loop, not inside as your code has it
max_age = max(age)

for person in lst:
    if person[2] == 1 and int(person[1]) == max_age:
        name_of_oldest_person_in_family_1 = person[0]
        break

您也可以使用一行来完成此操作

from itertools import ifilter

lst = ...
oldest = max(ifilter(lambda x: x[2] == 1, lst), key=lambda x: x[1])

要将年龄“链接”回原始列表,我建议将年龄列表更改为字典:

age = {}

在该词典中,您可以将年龄作为关键字存储,并将其来自列表作为列表存储。 例如,第一个父亲是50岁,当将此数据附加到年龄字典后,它将显示为

{50 : last[0]}

使用这样的字典,可以轻松访问原始列表。


要么...
我强烈建议为家庭成员创建一个班级,并设置姓名和年龄属性。 您可以通过定义它们的类来区分这两个族。 这是我的处理方式:

 class Family1(): def __init__(self,name,age): self.name = name self.age = age class Family2(Family1): def __init__(self,name,age): Family1.__init__() dad1 = Family1("Dad",50) # etcetera 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM