基于第二个列表中的元素对列表进行排序和筛选

2024-05-19 10:08:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个列表,第一个列表包含人名,每个人都有不同的字符,例如数字、字母,例如:

listNameAge = ['alain_90xx', 'fred_10y', 'george_50', 'julia_10l','alain_10_aa', 'fred_90', 'julia_50', 'george_10s', 'alain_50', 'fred_50', 'julia_90']

第二个包含此人的姓名:

^{pr2}$

使用第二个列表,我想将第三个列表与第一个列表相关联,以便第一个列表中的每个名称都与其在第二个列表中的索引位置相关联,即:

thirdlist = [2, 0, 3, 1, 2, 0, 1, 3, 2, 0, 1]

名称和字符由下划线分隔,但字符可以是任何类型。我可以循环listNameAge的元素,使用字符串上的.split('_')将人名与其他字符分开,找到它是哪个名字,并使用第二个循环在listName中找到它的索引。在

然而,我想知道是否有更简单的方法来做到这一点,即避免使用循环,只使用一个理解列表?在


Tags: 名称类型列表字母数字fred字符aa
3条回答

对于这个具体的问题,我建议你使用一个循环只是为了清楚。但是,如果必须使用列表理解,则可以使用基本相同的方法:

thirdlist = [listName.index(x[:x.find('_')]) for x in listNameAge]

您可以获取listNameAge中的每一项,然后split在{}上,得到分割的第一部分,然后使用index在第二个列表中找到它。在

>>> [listName.index(i.split('_')[0]) for i in listNameAge]
[2, 0, 3, 1, 2, 0, 1, 3, 2, 0, 1]

虽然你可以用一行代码来完成这个任务,但我认为,为了提高效率,建立一个字典是值得的:

namePos = dict((name, i) for (i, name) in enumerate(listName))
>>> [namePos[n.split('_')[0]] for n in listNameAge]
[2, 0, 3, 1, 2, 0, 1, 3, 2, 0, 1]

代码的(预期)运行时间是Θ(m+n),其中m是第一个列表的长度,n是另一个列表的长度。在

相关问题 更多 >

    热门问题