通过索引列表检查索引

时间:2016-05-19 16:44:17

标签: python list indexing

我有以下列表:

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

从这里开始,我想不出一种方法可以将最旧的背部连接到它的线上,以便我可以打印它。有帮助吗?干杯!!

4 个答案:

答案 0 :(得分:1)

您可以使用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号)是一个整数,但您正在使用字符串测试成员资格。您的年龄也被编码为字符串,这就是我的键函数将其转换为整数的原因。

答案 1 :(得分:0)

您可以(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

答案 2 :(得分:0)

您也可以使用一行

来完成此操作
from itertools import ifilter

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

答案 3 :(得分:0)

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

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