2014-05-22 4 views
-2

J'ai un intervalle de ints dans une liste obtenue à partir d'un fichier texte ...Python moyen le plus rapide pour indexer un intervalle de ints à une liste de ints

start = x """where 43189 < x < y < 4600941""" 
end = y 
list = [x,...,y] 

Je suis Boucler dans une colonne de beaucoup de nombreux ints d'un autre fichier ...

for line in open(file): 
    column = line.split() 
    print column[1] 

sortie:

43189 
43190 
... 
4600941 

Lorsque les numéros sont commandés, mais ont un am inconnu ount de lacunes

Quelle serait la méthode la plus rapide pour indexer le début de la liste dans les entiers recueillis à partir de la colonne [1]? L'intervalle se situe quelque part entre 43189 et 4600941. La comparaison itérative de chaque int dans la colonne par rapport à la valeur de départ dans l'intervalle est très longue et inutile si la valeur de départ n'est pas égale dans la colonne (il y a de nombreuses lacunes)

EDIT:

Je fais cela sur de nombreux intervalles, pas seulement un si x et y sont arbitraires, mais on sait 43189 < x < y < 4.600.941, mon problème est x ou y ou tout int entre ne peut pas être dans l'ensemble des nombres que je les compare, alors quelle serait la meilleure façon d'ajouter l'iterat ion sur l'intervalle à l'int prochaine si elle ne se trouve pas dans la colonne d'ints?

+1

Pourquoi devez-vous comparer les valeurs du fichier aux valeurs de la liste (qui contient des nombres séquentiels)?Pourquoi ne pas simplement comparer avec «x» et «y»? –

+1

Pouvez-vous écrire et un exemple avec la valeur réelle de 'x' et' y'? –

+0

Vous allez devoir clarifier ce que vous essayez de faire. Je l'ai lu plusieurs fois et tout ce que je peux comprendre, c'est que vous lisez des nombres à partir d'un fichier; Je n'ai aucune idée de ce que vous désirez. –

Répondre

1

Je ne suis pas 100% sûr que ce soit ce que vous demandez, mais ma compréhension de votre question est que si vous faites une liste l, comme ceci:

with open(file) as f: 
    l = [line.split()[1] for line in f] # line.split()[1] == column[1] from your example 

Vous voulez savoir ce que index sous l que x est à. Si cela est vrai, vous pouvez utiliser le module bisect pour aider à cela, car il semble l est garanti à trier:

import bisect 

def index(a, x): 
    'Locate the leftmost value exactly equal to x' 
    i = bisect_left(a, x) 
    if i != len(a) and a[i] == x: 
     return i 
    raise ValueError 

Vous pouvez ensuite appeler i = index(l, x) pour trouver l'indice qui se produit au sein xl. Si x n'est pas dans l, ValueError sera élevé. Faites-moi savoir si j'ai mal compris et nous pouvons essayer de l'adapter à vos besoins.

Edit:

Encore une fois, parce que ce n'est pas tout à fait clair ce que vous essayez de faire, il est possible que la simple lecture de tous les ints en file dans un dict couvrira vos besoins:

with open(file) as f: 
    d = dict((line.split()[1], 1) for line in f) 

Cela vous donnerait une dict où les clés sont tous les ints dans file. Vous pouvez alors dire que

if x in d: 
    # Do stuff 

Pour rapidement (O (1) en moyenne) déterminer si x est présent dans file.

Questions connexes