2016-12-29 2 views
3

У меня есть список, как это, например:bisect_left по первому пункту списка в списке, Python 3

L = [(0, "test", "value"), (0, "test2", "value2")] 

и мне нужно = bisect_left первого элемента каждого кортежа найти индекс в списке. Тем не менее, я не могу придумать способ сделать это без создания списка всех этих первых пунктов, прежде чем руки:

exampleList = [L[i][0] for i in range(len(L))]

какие-либо идеи по-другому, чтобы сделать это, как это работает, но когда мой список доходит до 5000 предметов, это очень медленно, и мне нужен более быстрый способ сделать это?

+0

[bisect left or right] (https://docs.python.org/2/library/bisect.html) уже находится на этом языке. – Prune

ответ

2
import bisect 
L = [(0, "test", "value"), (1, "test2", "value2"),(3,"test3","value3")] 
print (bisect.bisect_left(L,(2,))) 

питон занимается кортежами сравнений большим ... просто передать его (2,"asd","dsa") или даже просто (2,) (или что ваш индекс местоположение детали вы пытаетесь найти)

или вы могли пройти мимо (0,"asd","value"), и он знал, что лезет из другого (0,"test","value") item tuple ... или (0,"zzzz","value") и он будет знать, что бы поместить его справа от этого предмета

4

У Python есть встроенный bisect_left, вы можете использовать его. Вам не нужно создавать весь промежуточный список, вам просто нужен ленивый объект, который извлекает первый элемент из кортежа в этой позиции.

Что-то простое, как:

class Proxy(object): 
    def __getitem__(self, item): 
     return L[item][0] 
+0

Отличный ответ! Благодарю. –

Смежные вопросы