3 回答

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超2個(gè)贊
我發(fā)現(xiàn)這pandas似乎針對(duì)此類問題進(jìn)行了優(yōu)化。
import random
import pandas as pd
x = [f's{i}' for i in range(1000)]
l = [random.choice(x) for _ in range(2000000)]
output = pd.DataFrame(l).groupby([0]).indices
它可以比enumerate最佳場景(組的大小較大)快 3 倍,而在組的大小較小(每組 1 - 2 個(gè)項(xiàng)目)的情況下慢 3 倍。

TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超5個(gè)贊
您可以循環(huán)遍歷元素,構(gòu)建一個(gè)字典,將元素映射到該元素的索引列表。使用defaultdictof 類型list對(duì)此很方便,因?yàn)榈谝淮巫x取新元素時(shí)會(huì)自動(dòng)獲得一個(gè)空列表。
from collections import defaultdict
list_ex = ['s1', 's2', 's1', 's4', 's2', 's3', 's1']
indices = defaultdict(list)
for i, v in enumerate(list_ex):
indices[v].append(i)
print(indices)
這將打印以下內(nèi)容:
defaultdict(<class 'list'>, {'s1': [0, 2, 6], 's2': [1, 4], 's4': [3], 's3': [5]})

TA貢獻(xiàn)1831條經(jīng)驗(yàn) 獲得超10個(gè)贊
這是使用列表理解的簡短解決方案:
locations = [el[0] for el in enumerate(list_ex) if el[1] == "s1"]
解釋
枚舉創(chuàng)建位置/元素對(duì)的列表,它看起來像這樣:
[(0, 's1'), (1, 's2'), (2, 's1'), (3, 's4'), (4, 's2'), (5, 's3'), (6, 's1')]
下面的代碼得到相同的結(jié)果,只是以 for 循環(huán)形式顯示:
target = 's1'
locations = []
for el in enumerate(list_ex):
if el[1] == target:
locations.append(el[0])
添加回答
舉報(bào)