Conseils (structure de données) à connaître lors de la programmation de compétitions avec Python2

La partie sur la structure de données de conseils à connaître lors de la programmation de la compétition avec Python2 a été divisée.

La version Python est ** 2.7.5 ** (En Python3, les spécifications telles que l'entrée et la sortie sont très différentes, il est donc recommandé de se référer à d'autres articles).

int

Type entier.

À proprement parler, les entiers Python incluent le type entier int et le type entier long long.

Pour cette raison, vous ne devez pas trop vous inquiéter.

Convertir une chaîne en entier

print int('10') # 10

J'aime ce domaine car il est très concis.

Conversion de base

La conversion Radix d'entiers se produit fréquemment dans les ordinateurs de processus.

@ n_knuu6 m'a appris.

En utilisant format (), il est possible de convertir un nombre décimal en une chaîne de caractères exprimée en 2/8/16.

#Nombre binaire
b = format(10, 'b') # '1010'

#8 base
o = format(10, 'o') # '12'

#Hexadécimal(Minuscule)
x = format(10, 'x') # 'a'

#Hexadécimal(lettre majuscule)
X = format(10, 'X') # 'A'

Inversement, si vous voulez convertir une chaîne de caractères de base 2/8/16 en un nombre décimal, spécifiez la base de la chaîne de caractères d'origine dans le deuxième argument de ʻint () `.

d1 = int('1010', 2) # 10
d2 = int('12', 8) # 10
d3 = int('a', 16) # 10
d4 = int('A', 16) # 10

Opération de bit

Je l'écrirai un jour.

float

Type à virgule flottante.

Convertir une chaîne en virgule flottante

print float('10.00') # 10.0

Traitement lorsque le résultat de la division devient virgule flottante

Les points suivants sont souvent dépendants des relations en virgule flottante.

#Le reste de la division est tronqué
a = 5 / 2 # 2

Si le résultat de la division entre entiers est une valeur non entière, le résultat est tronqué (Python 3 semble résoudre ce problème).

Si vous voulez représenter correctement la division entre les entiers,

a1 = 5 * 1.0 / 2 # 2.5
a2 = 5. / 2 # 2.5
a3 = float(5) / 2 # 2.5

Comme indiqué dans, la molécule ou le dénominateur doit être de type flottant.

Manipuler l'infini

Infinity, souvent utilisé dans la programmation compétitive.

Bien sûr, il est possible de définir une valeur entière très grande telle que 10000000000 comme infini, mais cela peut provoquer des bogues inattendus tels que la possibilité de dépasser la valeur définie en fonction de la valeur d'entrée.

En Python, float ('inf') peut représenter l'infini.

p_inf = float('inf') #Infini positif
print p_inf > 10000000000 # True
print p_inf + 10000000000 # inf
print p_inf - 10000000000 # inf
print min(10000000000, float('inf')) # 10000000000

n_inf = -float('inf') #Infini négatif
print n_inf < -10000000000 # True

print float('inf') - float('inf') # nan
print float('inf') / float('inf') # nan
print float('inf') * 0 # nan

Notez que la valeur devient nan (indéfinie) lorsque la soustraction ou la division est effectuée entre les infinis ou lorsque l'infini est multiplié par 0 comme décrit ci-dessus.

str

Type de chaîne de caractères. Comme avec Java, sachez que vous ne pouvez pas modifier la chaîne de caractères (réaffectez-la aux éléments qui composent la chaîne de caractères).

Sortir les chaînes de caractères dans l'ordre inverse

Je l'utilise très souvent (mais oublie vite).

s = 'abc'
reverse = s[::-1] # 'cba'

Conversion d'une chaîne de caractères et d'une liste de chaque caractère de la chaîne de caractères

Ceci est également souvent utilisé.

s = 'abc'
l = list(s) # ['a', 'b', 'c']

ns = ''.join(l) # 'abc'
ns2 = ','.join(l) # 'a,b,c'

#Au fait, str(l)N'est pas une opération inverse
bad = str(l) # "['a', 'b', 'c']"

Obtenir le code ASCII à partir de caractères alphanumériques

Dans la programmation de compétition, les codes ASCII sont souvent obtenus à partir de caractères (le célèbre est le code César).

c = 'a'
print ord('a') # 97

#Erreur si vous ajoutez une chaîne de caractères de 2 caractères ou plus ou un caractère qui ne peut pas être représenté par un code ASCII à l'argument
print ord('ab') # TypeError

list

Les soi-disant tableaux (à proprement parler, Python a également un module de tableau, donc c'est une erreur, mais à moins que vous n'ayez besoin de beaucoup d'accélération, utilisez une liste). Il existe différentes fonctions.

5. Structure des données - Documentation Python 2.7ja1

Liste-Créer, Extraire, Remplacer, Ajouter, Rechercher, Supprimer, Nombre d'éléments-Hikimemo

Les bases sont écrites sur la page ci-dessus, elles sont donc omises.

Initialisation

Si le nombre d'éléments est petit, vous pouvez le remplacer tel quel, mais par exemple en C ++

int a[100][100];

Que faire avec quelque chose comme ça.

Initialisation de la liste unidimensionnelle

Il existe une initialisation par notation d'inclusion de liste et une initialisation par \ *.

#Les deux sont des listes avec 100 0 consécutifs([0, 0, ..., 0])Vers la variable l
l = [0 for i in range(100)] #Initialisation à l'aide de la notation d'inclusion de liste
l = [0] * 100 # *Initialisation avec

Au fait, en comparant le temps d'exécution en utilisant% timeit of ipython,

In [45]: %timeit [0] * 1000000
100 loops, best of 3: 6.66 ms per loop

In [46]: %timeit [0 for i in range(1000000)]
10 loops, best of 3: 65.1 ms per loop

Par conséquent, il a été constaté que l'initialisation à l'aide de * est plus rapide.

Initialisation de la liste 2D

Ici, pour générer une liste bidimensionnelle de 10 \ * 10,

l = [[0] * 10] * 10

Est faux. Si vous utilisez \ * pour une liste, la référence de la liste sera copiée, donc

l = [[0] * 10] * 10
l[0][0] = 1
print l
# [[1, 0, 0, ..., 0],
#  [1, 0, 0, ..., 0],
#  ...
#  [1, 0, 0, ..., 0]]

Comme indiqué, le changement se propage à d'autres parties. C'est un endroit plutôt addictif.

Correctement,

l = [[0] * 10 for i in range(10)]
l[0][0] = 1
print l
# [[1, 0, 0, ..., 0],
#  [0, 0, 0, ..., 0],
#  ...
#  [0, 0, 0, ..., 0]]

Ou

l = [[0 for j in range(10)] for i in range(10)]

Laisser. La même chose s'applique à 3 dimensions et plus.

Quand j'ai pris une référence de temps d'exécution pour cela aussi,

In [40]: %timeit [[0] * 1000 for i in range(1000)]
100 loops, best of 3: 7.04 ms per loop

In [42]: %timeit [[0 for j in range(1000)] for i in range(1000)]
10 loops, best of 3: 48 ms per loop

Il s'est avéré qu'il semble préférable d'utiliser \ * là où il peut être utilisé.

Notation d'inclusion de liste

5. Structure des données - Documentation Python 2.7ja1

Notation d'inclusion de liste Python - Comparaison avec l'écriture de Ruby et Haskell | Notes pour oublier bientôt le cerveau

Notation spécifique à Python pour le calcul sur des listes.

Il semble que le coût d'apprentissage soit un peu élevé pour la spécification du langage Python, mais je pense que cela vaut la peine de s'en souvenir car il permet des expressions simples et puissantes.

Comme mentionné dans l'exemple ci-dessus, il doit être utilisé à la place de map () et filter ().

l = range(5) # [0, 1, 2, 3, 4]
x = [2 * e for e in l if e >= 3] #Extraire seulement 3 éléments ou plus de l(filter), Renvoie un ensemble de doublés sous forme de liste(map)
print x # [6, 8]

Applicable également aux listes multidimensionnelles.

l = [[0] * 10 for i in range(10)]
x = [[e + 1 for e in l[i]] for i in range(len(l))] #Ajouter 1 à tous les éléments de la liste
print l
# [[1, 1, ..., 1],
#  [1, 1, ..., 1],
#  ...
#  [1, 1, ..., 1]]

Vous pouvez également écrire une courte boucle for. En général, la notation d'inclusion de liste est plus rapide.

l = []
for i in range(10):
    for j in range(10):
        l.append((i, j))
print l
# [(0, 0),
#  (0, 1),
#  (0, 2),
#  ...
#  (9, 8),
#  (9, 9)]

#Le code ci-dessus peut être écrit sur une seule ligne
print [(i, j) for i in range(10) for j in range(10)]

L'imbrication est possible comme indiqué ci-dessous, mais elle n'est pas recommandée car elle est souvent compliquée.

l = range(5) # [0, 1, 2, 3, 4]
x = [e for e in [2 * e for e in l if e >= 3] if e > 7] #Parmi les éléments de l, seuls 3 ou plus sont retirés, et seuls ceux supérieurs à 7 sont renvoyés sous forme de liste pour l'ensemble des éléments doublés.
print x # [8]

Trier

Il existe une fonction non destructive sorted () et une méthode destructive sort ().

«Sorted ()» et «sort ()» sont triés par défaut par ordre croissant, mais peuvent être modifiés en ordre décroissant en passant «reverse = True» comme argument.

Si l'élément à trier est une chaîne de caractères, il est trié par ordre lexical.

l = [5, 1, 3, 4, 2]

print sorted(l) # [1, 2, 3, 4, 5]
print l # [5, 1, 3, 4, 2]
print l.sort() # None
print l # [1, 2, 3, 4, 5]

l.sort(reverse=True)
print l # [5, 4, 3, 2, 1]

Si chaque élément de la liste est un tapple, par défaut, le 0ème élément de chaque élément est trié, puis le 1er élément est trié pour la même valeur, et ainsi de suite.

l2 = [('hoge', 1), ('fuga', 3), ('piyo', 2), ('fuga', 1)]

print sorted(l2) # [('fuga', 1), ('fuga', 3), ('hoge', 1), ('piyo', 2)]

En donnant key =" expression lambda " à l'argument, le tri en spécifiant la clé est également possible.

l2 = [('hoge', 1), ('fuga', 3), ('piyo', 2), ('fuga', 1)]

#Pour l2, les deux suivants sont équivalents
print sorted(l2) # [('fuga', 1), ('fuga', 3), ('hoge', 1), ('piyo', 2)]
print sorted(l2, key=lambda x: (x[0], x[1])) # [('fuga', 1), ('fuga', 3), ('hoge', 1), ('piyo', 2)]

#Triez par ordre décroissant pour le deuxième élément et triez par ordre croissant pour le premier élément s'ils ont la même valeur.
print sorted(l2, key=lambda x: (-x[1], x[0]) # [('fuga', 3), ('piyo', 2), ('fuga', 1), ('hoge', 1)]

définir et dict

Je l'écrirai un jour.

Pile / file d'attente

En Python, l'objet liste agit comme une pile et une file d'attente.

l = [0, 1, 2, 3]

# push/enque
l.append(4)
print l # [0, 1, 2, 3, 4]

# pop
x = l.pop() # 4
print l # [0, 1, 2, 3]

# deque
y = l.pop(0) # 0
print l # [1, 2, 3]

** Addenda: ** Merci à @wonderful_panda.

8.3. Collections - Types de données de conteneurs hautes performances - Documentation Python 2.7ja1

ʻAppend () et pop () sont $ O (1) $, mais pop (0) `est une opération de $ O (n) $, donc si le nombre d'éléments dans la liste augmente, il faudra du temps pour diminuer. Ce sera comme ça. Lorsque vous utilisez des files d'attente (stack,), vous pouvez utiliser collections.deque en toute sécurité.

from collections import deque

l = [0, 1, 2, 3]
q = deque(l)

# push/enque
q.append(4)
print q # deque([0, 1, 2, 3, 4])

# pop
x = q.pop() # 4
print q # deque([0, 1, 2, 3])

# deque
y = q.popleft() # 0
print q # deque([1, 2, 3])

File d'attente de priorité

Implémentation de l'algorithme Dyxtra en Python - Ne le dis pas!

Indication prioritaire (repère prioritaire) qui est prise en charge dans la programmation de la compétition.

J'ai déjà écrit un article sur mon blog, alors veuillez vous y référer.

Recommended Posts

Conseils (structure de données) à connaître lors de la programmation de compétitions avec Python2
Conseils (structure de contrôle) à connaître lors de la programmation de la compétition avec Python2
Conseils à savoir lors de la programmation de compétitions avec Python2
Conseils (entrée / sortie) à connaître lors de la programmation de compétitions avec Python2
Conseils à connaître lors de la programmation de compétitions avec Python2 (bibliothèque utile)
Connaissances à connaître lors de la programmation de concours avec Python2
Conseils à savoir lors de la programmation de la compétition avec Python2 (Autres spécifications du langage)
Programmation compétitive avec python
Connaissance de l'algèbre linéaire que vous devez savoir lorsque vous faites de l'IA
Programmation de compétition avec les paramètres de l'environnement local python
Créez des données de test comme ça avec Python (partie 1)
Conseils personnels lorsque vous faites diverses choses avec Python 3
[python] [vscode] Lorsque vous vous fâchez avec space-tab-mixed
Résolution avec Python [100 questions passées que les débutants et les intermédiaires devraient résoudre] (053 --055 Méthode de planification dynamique: Autres)
Vous devez savoir si vous utilisez Python! 10 bibliothèques utiles
Qu'utilisez-vous lorsque vous testez avec Python?
Toutes les méthodes destructrices que les data scientists devraient connaître
Un serveur qui fait écho aux données POSTées avec flask / python
Structure de répertoire lors de l'écriture de tests avec unittest standard Python 3
Analyse de données avec python 2
3. 3. Programmation IA avec Python
Programmation Python avec Atom
[Tutoriel Python] Structure des données
Analyse de données avec Python
[Astuces] Traiter l'erreur qui se produit lors de la tentative d'installation de la série Python 3 inférieure à 3.5.3 avec pyenv
Un mémo qui lit les données de dashDB avec Python et Spark
Utilisez une macro qui s'exécute lors de l'enregistrement de python avec vscode
Résolvez le livre en spirale (algorithme et structure de données) avec python!
Lorsque vous souhaitez enregistrer les données initiales de Django avec des relations
Résumé Xpath lors de l'extraction de données d'un site Web avec Python Scrapy
Programmation avec Python et Tkinter
J'ai essayé d'en savoir le plus possible sur GIL que vous devriez savoir si vous faites un traitement parallèle avec Python
[Astuces] Gérez Athena avec Python
Erreur lors de la lecture avec python
Programmation réseau avec Python Scapy
Conseils de traitement des données avec Pandas
Lire des données json avec python
J'essaierai de créer une structure de répertoires Python que je ne regretterai pas plus tard
Que dois-je faire avec la structure de répertoires Python après tout?
Introduction de "scikit-mobility", une bibliothèque qui vous permet d'analyser facilement les données de flux humain avec Python (Partie 1)
Résolvez avec Python [100 questions passées que les débutants et les intermédiaires devraient résoudre] (039 --045 Méthode de planification dynamique: variante Knapsack DP)