Tengo una lista de 50 términos que necesito aprender y, en lugar de copiar y pegar cada uno en una aplicación de tarjeta de memoria flash, estoy tratando de poner cada término y su definición en un diccionario de Python.

Tengo el siguiente código:

terms = """1   Alliteration- the repetition of a speech sound in a sequence of nearby words 2 Term - definition..."""

definitions = {}


for word in text.split():
    if word.isdigit():
        definitions[word+1] = ???

Quiero que el código lea las cadenas y si toca un dígito, debería guardar la siguiente palabra con la que se encuentra, p. "Aliteración" como la clave y todas las palabras después de ella, hasta el siguiente número, como el valor, p.

"la repetición de un sonido de discurso en una secuencia de palabras cercanas"

¿Alguna idea sobre cómo escribir el código que resuelve el problema?

1
Justin O'Brien 28 oct. 2017 a las 19:45

4 respuestas

La mejor respuesta

Prueba el siguiente código:

import re

str1 = """1   Alliteration- the repetition of a speech sound in a sequence of 
    nearby words 2 Term - definition..."""
str2 = re.split("\d+",str1)
dict1 = {a.split("-")[0].strip():a.split("-")[1].strip() for a in str2 if '-' in a}
0
baduker 4 mar. 2018 a las 16:41

Pondría los términos en una lista anidada, así,

terms = [ [word, definition], [word, definition], etc ]

Luego pase sobre terms

definitions = {}


for item in terms:
  word = item[0]
  meaning = item[1]
  definitions[word] = meaning

EDITAR: Supongo que si pudieras poner los términos en una matriz, podrías ponerlos fácilmente en un diccionario con la misma facilidad, así que supongo que la lista de términos es como es y no está cambiando, en cuyo caso mi respuesta no es útil

0
Jason Fry 28 oct. 2017 a las 16:58

Puede usar expresiones regulares para reemplazar todos los dígitos a un valor específico y dividir la cadena en ese valor.

In [24]: terms = """1   Alliteration- the repetition of a speech sound in a sequence of nearby words 2 Term - definition..."""

In [25]: new_term = re.sub("\d+", "?-", terms)

In [26]: new_term
Out[26]: '?-   Alliteration- the repetition of a speech sound in a sequence of nearby words ?- Term - definition...'

In [27]: li =new_term.split('?-')
In [28]: li
Out[28]:
['',
 '   Alliteration- the repetition of a speech sound in a sequence of nearby words ',
 ' Term - definition...']
In [29]: list(map(lambda t: t.strip(), li[1:]))
Out[29]:
['Alliteration- the repetition of a speech sound in a sequence of nearby words',
 'Term - definition...'

Puede usar cualquier cosa en lugar de ?- que no tendrá en ningún otro lugar de la cadena.

0
Ankur Ankan 28 oct. 2017 a las 16:50

Puede usar expresiones regulares para dividir con cualquier número. Y luego, en la lista resultante, se divide para obtener la palabra y su significado. ¡Guárdelo en su diccionario!

>>> terms
'1   Alliteration- the repetition of a speech sound in a sequence of nearby words 2 Term - definition...'
>>> d={}
>>> import re
>>> dict(l.strip().split('-') for l in re.split('[0-9]',terms) if l)
{'Alliteration': ' the repetition of a speech sound in a sequence of nearby words', 'Term ': ' definition...'}
>>> d
{'   Alliteration': ' the repetition of a speech sound in a sequence of nearby words ', ' Term ': ' definition...'}

Es decir,

>>> re.split('[0-9]',terms)
['', '   Alliteration- the repetition of a speech sound in a sequence of nearby words ', ' Term - definition...']
>>> [l for l in re.split('[0-9]',terms)]
['', '   Alliteration- the repetition of a speech sound in a sequence of nearby words ', ' Term - definition...']
>>> [l for l in re.split('[0-9]',terms) if l]
['   Alliteration- the repetition of a speech sound in a sequence of nearby words ', ' Term - definition...']
>>> [l.strip().split('-') for l in re.split('[0-9]',terms) if l]
[['Alliteration', ' the repetition of a speech sound in a sequence of nearby words'], ['Term ', ' definition...']]
>>> dict(l.strip().split('-') for l in re.split('[0-9]',terms) if l)
{'Alliteration': ' the repetition of a speech sound in a sequence of nearby words', 'Term ': ' definition...'}

Sin usar la comprensión de la lista,

>>> for l in re.split('[0-9]',terms):
...     if l:
...             key,value = l.strip().split('-')
...             d[key]=value
...

¡Aquí, en lugar de d[key]=value puedes usar d[key]=d.get(key,'')+value+'\n' si una palabra en términos puede tener más de un significado!

0
Keerthana Prabhakaran 28 oct. 2017 a las 17:12