web-dev-qa-db-fra.com

Python 3 tourne la plage à une liste

J'essaie de faire une liste avec des nombres 1-1000 dedans. Évidemment, cela serait ennuyeux d’écrire/de lire, alors j’essaie de faire une liste avec une plage. En Python 2, il semble que:

some_list = range(1,1000)

aurait fonctionné, mais dans Python 3, la plage est similaire à la variable xrange de Python 2?

Quelqu'un peut-il donner un aperçu de cela?

106
Boathouse

Vous pouvez simplement construire une liste à partir de l'objet range:

my_list = list(range(1, 1001))

Voici comment vous le faites avec les générateurs de python2.x. En règle générale, vous n’avez probablement pas besoin d’une liste car vous pouvez utiliser la valeur de my_list[i] de manière plus efficace (i + 1), et si vous avez juste besoin de la parcourir, vous pouvez simplement recourir à range.

Notez également que sur python2.x, xrange est toujours indexable.1. Cela signifie que range sur python3.x a également la même propriété2

1print xrange(30)[12] fonctionne pour python2.x

2La déclaration analogue à 1 dans python3.x est print(range(30)[12]) et cela fonctionne aussi.

136
mgilson

En Pythons <= 3.4, vous pouvez, comme le suggèrent d’autres, utiliser list(range(10)) afin de faire une liste hors d’une plage (En général, toute valeur itérable).

Une autre alternative, introduite dans Python 3.5 avec ses généralisations de décompression, consiste à utiliser * dans une liste littérale []:

>>> r = range(10)
>>> l = [*r]
>>> print(l)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Bien que cela soit équivalent à list(r), sa syntaxe littérale et le fait qu’aucun appel de fonction n’est impliqué ne le permettent pas de s’exécuter plus rapidement. C'est aussi moins de caractères, si vous avez besoin de coder le golf :-)

17

La raison pour laquelle Python3 n’a pas de fonction permettant d’obtenir directement une liste à distance est que le concepteur original de Python3 était assez novice dans Python2. Il n'a envisagé que l'utilisation de la fonction range () dans une boucle for; par conséquent, la liste ne devrait jamais avoir besoin d'être développée. En fait, très souvent, nous devons utiliser la fonction range () pour générer une liste et la passer à une fonction.

Par conséquent, dans ce cas, Python3 est moins pratique que Python2 pour les raisons suivantes:

  • En Python2, nous avons xrange () et range (); 
  • En Python3, nous avons range () et list (range ())

Néanmoins, vous pouvez toujours utiliser le développement de liste de cette manière:

[*range(N)]
5
xuancong84

Vous ne devriez vraiment pas avoir besoin d'utiliser les numéros 1 à 1000 dans une liste. Mais si, pour une raison quelconque, vous avez vraiment besoin de ces chiffres, vous pouvez faire:

[i for i in range(1, 1001)]

Liste Compréhension en quelques mots:

La compréhension de la liste ci-dessus se traduit par:

nums = []
for i in range(1, 1001):
    nums.append(i)

Ceci est juste la syntaxe de compréhension de liste, bien qu'à partir de 2.x. Je sais que cela fonctionnera en python 3, mais je ne suis pas sûr s'il existe également une syntaxe mise à niveau.

La plage commence, y compris le premier paramètre; mais se termine jusqu’à, non compris le deuxième paramètre (lorsque 2 paramètres sont fournis; si le premier paramètre est désactivé, il commence à «0») 

range(start, end+1)
[start, start+1, .., end]
4
inspectorG4dget

En fait, si vous voulez 1-1000 (inclus), utilisez la fonction range(...) avec les paramètres 1 et 1001: range(1, 1001), car la fonction range(start, end) passe de début à (fin-1), inclus.

3
CosmicComputer

En fait, il s’agit d’une rétro-gradation de Python3 par rapport à Python2. Certes, Python2 qui utilise range () et xrange () est plus pratique que Python3 qui utilise respectivement list (range ()) et range (). La raison en est que le concepteur original de Python3 n’est pas très expérimenté, ils ont seulement envisagé l’utilisation de la fonction de plage par de nombreux débutants pour effectuer une itération sur un grand nombre d’éléments où la mémoire et le processeur sont inefficaces; mais ils ont négligé l’utilisation de la fonction range pour produire une liste numérique. Maintenant, il est trop tard pour qu'ils reviennent déjà.

Si je devais être le concepteur de Python3, je vais:

  1. utiliser irange pour retourner un itérateur de séquence
  2. utiliser lrange pour retourner une liste de séquence
  3. utilisez range pour renvoyer soit un itérateur de séquence (si le nombre d'éléments est grand, par exemple un intervalle (9999999), soit une liste de séquence (si le nombre d'éléments est petit, par exemple un intervalle (10))

Cela devrait être optimal.

0
xuancong84

Utilisez Range en Python 3.

Voici un exemple de fonction qui retourne entre les nombres de deux nombres

def get_between_numbers(a, b):
    """
    This function will return in between numbers from two numbers.
    :param a:
    :param b:
    :return:
    """
    x = []
    if b < a:
        x.extend(range(b, a))
        x.append(a)
    else:
        x.extend(range(a, b))
        x.append(b)

    return x

Résultat

print(get_between_numbers(5, 9))
print(get_between_numbers(9, 5))

[5, 6, 7, 8, 9]  
[5, 6, 7, 8, 9]
0
Rajiv Sharma