[PYTHON] 100 coups de langue amateur: 02

C'est un record de défi de 100 langues de traitement knock 2015. Cliquez ici pour une liste (http://qiita.com/segavvy/items/fb50ba8097d59475f760).

L'environnement change à nouveau

Je n'ai encore posé que deux questions, mais j'ai décidé de changer à nouveau d'environnement. Changez Python en 3.x.

J'ai hésité à installer Python 3.x car cela semblait être un problème, mais j'ai demandé à _ha1f d'enseigner Anaconda dans Question précédente. Je pourrais facilement le faire 3.5.2. Je vous remercie!

Anaconda est comme un assortiment de paquets couramment utilisés. Vous pouvez trouver beaucoup d'explications par google, mais pour l'installation, [Installer Python en utilisant Anaconda (Ubuntu Linux)](http://pythondatascience.plavox.info/ Installer python / anaconda-ubuntu-linux /) est facile à comprendre. C'était.

Chapitre 1: Mouvement préparatoire

02. "Pat car" + "Tax" = "Patatokukasie"

Obtenez la chaîne de caractères "Patatokukashi" en reliant alternativement les caractères "Pattocar" + "Tax" depuis le début.

Le code fini:

main.py


# coding: utf-8
target1 = 'Voiture Pat'
target2 = 'Taxi'
result = ''
for (a, b) in zip(target1, target2):
	result += a + b
print(result)

main2.py


# coding: utf-8
from functools import reduce

target1 = 'Voiture Pat'
target2 = 'Taxi'
result = ''.join(reduce(lambda x, y: x + y, zip(target1, target2)))
print(result)

Résultat de l'exécution:

Terminal


Patatoku Kashii

À propos de zip () et ʻitertools.zip_longest () `

zip () crée une liste d'éléments à partir de plusieurs itérables (listes, taples, etc.). Python est incroyable d'avoir une fonction aussi utile!

J'essaierai diverses choses.

Interprète


>>> target1 = 'abcde'
>>> target2 = '12345'
>>> zip(target1, target2)
<zip object at 0x7f1294d76108>

cette? Aviez-vous un objet zip?

Quand je l'ai recherché, il semble que Python 2.x a renvoyé une liste, mais 3.x a renvoyé un itérateur. Il est peut-être devenu plus efficace car il a commencé à traiter petit à petit depuis l'avant (il semble que cela s'appelle un générateur). Soyez toujours conscient de la version lorsque vous consultez la documentation et les commentaires Python!

Puisqu'il s'agit d'un itérateur, vous pouvez vérifier le contenu en le convertissant en liste.

Interprète 1


>>> target1 = 'abcde'
>>> target2 = '12345'
>>> res_zip = zip(target1, target2)
>>> list(res_zip)
[('a', '1'), ('b', '2'), ('c', '3'), ('d', '4'), ('e', '5')]

Chaque élément est récupéré un par un et emballé dans un taple. C'est le flux de retirer un par un.

Si le nombre original d'éléments est différent, il sera ajusté au plus petit.

Interprète 2


>>> target1 = 'abc'
>>> target2 = '12345'
>>> res_zip = zip(target1, target2)
>>> list(res_zip)
[('a', '1'), ('b', '2'), ('c', '3')]

Si vous voulez faire correspondre le plus long, vous pouvez utiliser ʻitertools.zip_longest () `.

Interprète 3


>>> import itertools
>>> res_zip = itertools.zip_longest(target1, target2)
>>> list(res_zip)
[('a', '1'), ('b', '2'), ('c', '3'), (None, '4'), (None, '5')]

S'il n'y a pas assez d'éléments, Aucun sera entré, mais vous pouvez également le spécifier.

Interprète 4


>>> res_zip = itertools.zip_longest(target1, target2, fillvalue = 'zzz')
>>> list(res_zip)
[('a', '1'), ('b', '2'), ('c', '3'), ('zzz', '4'), ('zzz', '5')]

C'est le bordel.

Revenez à zip () et essayez d'en coller trois ou plus ensemble.

Interprète 5


>>> target1 = 'abcde'
>>> target2 = '12345'
>>> target3 = 'AIUEO'
>>> res_zip = zip(target1, target2, target3)
>>> list(res_zip)
[('a', '1', 'Ah'), ('b', '2', 'je'), ('c', '3', 'U'), ('d', '4', 'e'), ('e', '5', 'Oh')]

Le résultat est comme prévu.

Renvoie le résultat de zip ()

Si vous passez à nouveau le résultat de zip () à zip (), vous pouvez le récupérer. D'abord, utilisez zip () pour passer 3 listes et créer 5 taples.

Interprète 6


>>> target1 = 'abcde'
>>> target2 = '12345'
>>> target3 = 'AIUEO'
>>> res_zip = zip(target1, target2, target3)
>>> list(res_zip)
[('a', '1', 'Ah'), ('b', '2', 'je'), ('c', '3', 'U'), ('d', '4', 'e'), ('e', '5', 'Oh')]

Si vous passez à nouveau ces 5 taples à zip (), cette fois vous prendrez chaque élément des 5 taples pour faire un taple, vous reviendrez donc aux trois originaux. Je vois!

Interprète 7


>>> res_zip = zip(target1, target2, target3)
>>> res_list = list(res_zip)
>>> res2_zip = zip(res_list[0], res_list[1], res_list[2], res_list[3], res_list[4])
>>> list(res2_zip)
[('a', 'b', 'c', 'd', 'e'), ('1', '2', '3', '4', '5'), ('Ah', 'je', 'U', 'e', 'Oh')]

revenu! C'est un taple au lieu d'une chaîne, mais comment le retourner sera décrit plus tard.

De plus, zip () a un argument variable, mais il existe une fonction qui sépare l'argument en ajoutant \ * avant l'itérable. Par conséquent, vous ne devez pas écrire res_list [0], res_list [1] ... un par un, mais vous pouvez utiliser * res_list. Pratique!

Interprète 8


>>> res_zip = zip(target1, target2, target3)
>>> res_list = list(res_zip)
>>> res2_zip = zip(*res_list)
>>> list(res2_zip)
[('a', 'b', 'c', 'd', 'e'), ('1', '2', '3', '4', '5'), ('Ah', 'je', 'U', 'e', 'Oh')]

Retourner le taple en string

Interprète 9


>>> chars_tuple = ('a', 'b', 'c', 'd', 'e')
>>> ''.join(chars_tuple)
'abcde'

À propos de functools.reduce ()

Interprète 10


>>> def add(x, y):
...     return x + y
... 
>>> import functools
>>> functools.reduce(add, [1, 2, 3, 4, 5])
15

functools.reduce () passe le résultat précédent et la valeur prise de l'itérable à la fonction pour créer un nouveau résultat, qui est répété jusqu'à la fin de l'itérable. Le functools.reduce (add, [1, 2, 3, 4, 5]) dans l'exemple ci-dessus fera quelque chose comme le code suivant.

Interprète 11


>>> result = 0
>>> for x in [1, 2, 3, 4, 5]:
...     result = add(result, x)
... 
>>> result
15

La valeur initiale du résultat correspondant à "result = 0" peut être spécifiée par le troisième argument de "functools.reduce ()". Si omis, deux sont extraits de l'itérable uniquement pour la première fois et le résultat de leur transmission à la fonction est utilisé comme valeur initiale.

Dans le deuxième exemple de solution main2.py, l'expression lambda lambda x, y: x + y est spécifiée dans la partie fonction. Pour l'expression lambda, [100 amateurs de traitement de la langue frappent: 18](https://qiita.com/segavvy/items/adee520db1a257e347d5#%E3%83%A9%E3%83%A0%E3%83%80%E5 % BC% 8F) explique un peu, alors veuillez vous y référer.

J'étais accro à la transition d'état de l'itérateur

Ce à quoi j'étais accro à cette époque était qu'une fois qu'un itérateur était converti en liste, il ne pouvait plus être utilisé (un itérateur avancé ne peut pas être réinitialisé).

Par exemple, si vous exécutez l'interpréteur 7 immédiatement après avoir exécuté l'interpréteur 6 ci-dessus, la première ligne de l'interpréteur 7 res_zip = zip (cible1, cible2, cible3) semble inutile à première vue. Il fonctionne déjà sur la ligne 4 de l'interpréteur 6. Cependant, lors de la conversion en une liste avec la 5ème ligne list (res_zip) de l'interpréteur 6, l'itérateur de res_zip avance, donc même si vous listez (res_zip) à nouveau, ce sera une liste vide.

Si vous êtes habitué à Python, vous pourrez peut-être vous soucier de la transition d'état de l'itérateur naturellement, mais j'y ai été accro pendant un moment sans m'en apercevoir.   C'est tout pour le troisième coup. Si vous avez des erreurs, je vous serais reconnaissant de bien vouloir les signaler.

Recommended Posts

100 coups de traitement du langage amateur: 41
100 coups de traitement du langage amateur: 56
100 coups de traitement du langage amateur: 24
100 coups de traitement du langage amateur: 50
100 coups de traitement du langage amateur: 59
100 coups de traitement du langage amateur: 70
100 coups de traitement du langage amateur: 62
100 coups de traitement du langage amateur: 92
100 coups de langue amateur: 06
100 coups de traitement du langage amateur: 81
100 coups de traitement du langage amateur: 46
100 coups de traitement du langage amateur: 88
100 coups de traitement du langage amateur: 89
100 coups de traitement du langage amateur: 43
100 coups de traitement du langage amateur: 55
100 coups de traitement du langage amateur: 94
100 coups de traitement du langage amateur: 54
100 coups de traitement du langage amateur: 63
100 coups de traitement du langage amateur: 78
100 coups de traitement du langage amateur: 12
100 coups de traitement du langage amateur: 14
100 coups de langue amateur: 08
100 coups de traitement du langage amateur: 42
100 coups de traitement du langage amateur: 73
100 coups de traitement du langage amateur: 75
100 coups de traitement du langage amateur: 98
100 coups de traitement du langage amateur: 83
100 coups de traitement du langage amateur: 95
100 coups de traitement du langage amateur: 32
100 coups de traitement du langage amateur: 96
100 coups de traitement du langage amateur: 87
100 coups de traitement du langage amateur: 72
100 coups de traitement du langage amateur: 79
100 coups de langue amateur: 05
100 coups de langue amateur: 00
100 coups de langue amateur: 02
100 coups de traitement du langage amateur: 37
100 coups de traitement du langage amateur: 21
100 coups de traitement du langage amateur: 68
100 coups de traitement du langage amateur: 11
100 coups de traitement du langage amateur: 90
100 coups de traitement du langage amateur: 74
100 coups de traitement du langage amateur: 66
100 coups de traitement du langage amateur: 28
100 coups de traitement du langage amateur: 64
100 coups de traitement du langage amateur: 34
100 coups de traitement du langage amateur: 36
100 coups de traitement du langage amateur: 77
100 coups de langue amateur: 01
100 coups de traitement du langage amateur: 16
100 coups de traitement du langage amateur: 27
100 coups de traitement du langage amateur: 10
100 coups de traitement du langage amateur: 03
100 coups de traitement du langage amateur: 82
100 coups de traitement du langage amateur: 69
100 coups de traitement du langage amateur: 53
100 coups de traitement du langage amateur: 18
100 coups de traitement du langage amateur: 35
100 coups de traitement du langage amateur: 91
100 coups de traitement du langage amateur: 15
100 coups de traitement du langage amateur: 38