簡體   English   中英

通過匹配 python 中的主列表中的項目來生成索引列表

[英]Generate a list of indices by matching items in a master list in python

新手問題:假設我有一些類別和數據:

categories = ['cow', 'pig', 'rat', 'hen', 'dog', 'cat']
data = ['hen', 'cat', 'pig', 'hen', 'dog', 'cow', 'cat', 'dog', 'rat', 'hen' ]

如何生成數據的數字標簽列表,其中 label 是類別主列表中數據項的索引? 也就是說,生成列表[3, 5, 1, 3, 4, 0, 5, 4, 2, 3 ] ... 這當然不是由此產生的:

label = [index for item in data if categories[index] == item]    # useless!!

我知道可以使用 scikit-learn LabelEncoder生成此列表。 如何在純 python 中完成?

您可以嘗試列表index function:-

categories = ['cow', 'pig', 'rat', 'hen', 'dog', 'cat']
data = ['hen', 'cat', 'pig', 'hen', 'dog', 'cow', 'cat', 'dog', 'rat', 'hen' ]

res = []

for i in data:
    if i in categories:
        res.append(categories.index(i))
    else:
        res.append(-1)

print(res)

Output 將是:-

[3, 5, 1, 3, 4, 0, 5, 4, 2, 3]

也許這是過早的優化,但我可能會首先將類別名稱 map 到索引中,以避免對所有類別進行雙重嵌套循環:

categories = ['dog', 'fish', 'tree', 'toad']
data = ['toad', 'tree', 'dog', 'fish', 'toad', 'toad']

m = { name : idx for idx,name in enumerate(categories) }

print([ m[n] for n in data])

嘗試這個。 它將處理類別列表中不存在的項目。 它將為這些元素賦予-1值。

categories = ['cow', 'pig', 'rat', 'hen', 'dog', 'cat']
data = ['hen', 'cat', 'pig', 'hen', 'dog', 'cow', 'cat', 'dog', 'rat', 'hen' ]
print([categories.index(i) if i in categories else -1 for i in data])

你在正確的軌道上。 您需要使用列表查找 function, index

[categories.index(name) if name in categories else "missing" 
     for name in data]

Output:

[3, 5, 1, 3, 4, 0, 5, 4, 2, 3]

你可以試試這個:

def solve(categories, data):
    index_dict = dict(zip(categories, range(len(categories))))
    return [index_dict.get(i, "Not Found") for i in data]
categories = ['cow', 'pig', 'rat', 'hen', 'dog', 'cat']
data = ['hen', 'cat', 'pig', 'hen', 'dog', 'cow', 'cat', 'dog', 'rat', 'hen' ]
for i in range(0,len(categories)):
    for j in range(0,len(data)):
        if categories[i]==data[j]:
           data[j]=i

這可能會有所幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM