итеративно находите значение в словаре, используя ключ из списка, используя карту лямбда или понимание списка - PullRequest
0 голосов
/ 09 марта 2019

у меня есть словарь

d={1: [3, 6, 9], 3: [1, 6, 9], 6: [1, 3, 9], 9: [1, 3, 6], 2: [4, 7], 4: [10, 7], 7: [2, 4], 5: [8, 10], 8: [5, 10], 10: [5, 8, 11], 11: [10, 8, 3]}

и серия

x=pd.Series([3,8,9])

для каждого значения списка, я хочу найти соответствующие значения в словаре.

я использую для цикла

for i in range(len(x)):
    n=d[x.iloc[i]]

ожидаемый результат -

[1, 3, 6]

но поскольку данные имеют 1,6 М строк, цикл for замедляет процесс. Я думаю, что метод карты lamda, или понимание списка может увеличить скорость. Но у меня проблемы с обоими, я попробовал что-то вроде этого

n=[d[x] for i in range(len(x))]

, но это не работает. любой способ достичь цели

Ответы [ 2 ]

1 голос
/ 09 марта 2019

Это должно быть быстрее, чем при использовании всех ilocs:

for i in x:
    n=d[i]

Для списка из 1000 чисел это время: 147 мкс ± 7,51 мкс на цикл (среднее ± стандартное отклонение из 7 циклов, 10000 циклов)каждый)

в то время как цикл OPs с ilocs: 33,8 мс ± 1,35 мс на цикл (среднее ± стандартное отклонение из 7 циклов, 10 циклов каждый)

0 голосов
/ 09 марта 2019

IIUC

pd.Series(d).loc[x]
Out[47]: 
3    [1, 6, 9]
8      [5, 10]
9    [1, 3, 6]
dtype: object

При необходимости список

pd.Series(d).loc[x].tolist()
Out[68]: [[1, 6, 9], [5, 10], [1, 3, 6]]
...