从 python 中的列表中提取元素

问题描述

我有一个清单

["Sports","Soccer","Cricket","Food","Noodles","Cake","Burger","Country","US","UK","China"]

我想用带键的字典制作运动、美食和乡村

所有运动总是跟随列表项“Sports”直到“Food”,所有列表项总是跟随“Food”等等,并且“Sports”、“Food”和“Country”不会重新出现。

因此类别是键,其相关项是值

如下图

cleaned_output = {
    "Sports" : ["Soccer","Cricket"],"Food" : ["Noodles","Burger"],"Country" : ["US","China"]
}

我尝试这样做,但最终只有多个循环,请帮助我如何快速完成。

谢谢!

解决方法

你可以遍历key的列表,在数据列表中找到当前key的索引和下一个key的索引(如果当前是最后一个key,则为数据列表的长度),然后取中间的slice数据列表中的索引值。

data=["Sports","Soccer","Cricket","Food","Noodles","Cake","Burger","Country","US","UK","China"]
keys = ["Sports","Country" ]
out = {}
for idx,key in enumerate(keys):
    currIndex = data.index(key)
    nextIndex = data.index(keys[idx+1]) if idx<(len(keys)-1) else len(data)
    out.update({key: data[currIndex+1:nextIndex]})

输出:

{'Sports': ['Soccer','Cricket'],'Food': ['Noodles','Cake','Burger'],'Country': ['US','UK','China']}
,

您可以通过对列表的单个循环轻松完成此操作。关键思想是记住您当前正在添加到哪个组,并在每次加入新组时更新。如果每个键只出现一次,你可以这样做:

data = [
    "Sports","China"
]
cleaned_output = {
    "Sports": [],"Food": [],"Country": []
}
for item in data:
    if item in results:
        # item is a group name; update current group
        group = item
    else:
        # regular item; add to list for current group
        cleaned_output[group].append(item)
,

itertools.groupby试试:

from itertools import groupby

data=["Sports","China"]
keys = {"Sports","Country" }

item_list = [[*v] for _,v in groupby(data,key=lambda x: x in keys)]
d = {k[0]: v for k,v in zip(*(iter(item_list),) * 2)}

时间复杂度O(n)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...