2017-10-18 28 views
-1

Imaginez que j'ai la liste suivante:éléments de la liste Concaténer qui se situent entre les éléments de la liste de certaine valeur

>>> mylist 

[('a', u'DT'), 
('Satisfactory', u'JJ'), 
('tracing', u'VBG'), 
('with', u'IN'), 
('a', u'DT'), 
('fairly', u'RB'), 
('persistent', u'JJ'), 
('with', u'IN')] 

Comment puis-je concaténer les éléments de liste qui se situent entre les éléments qui contiennent u'IN' ou u'DT' et renvoient uniquement les éléments concaténés-à-dire :

[('Satisfactory tracing'), 
('fairly persistent')] 
+0

@engr_s C'est le deuxième élément du résultat: '('assez persistant')' – Barmar

+0

Essayez d'utiliser itertools.dropwhile() et itertools.takewhile(). –

Répondre

1

En voici une qui doit vous donner le résultat souhaité. Peut-être que vous avez besoin de l'optimiser un peu.

my_list = ([('a', u'DT'), 
      ('Satisfactory', u'JJ'), 
      ('tracing', u'VBG'), 
      ('with', u'IN'), 
      ('a', u'DT'), 
      ('fairly', u'RB'), 
      ('persistent', u'JJ'), 
      ('with', u'IN')]) 

sequence_enable = False 
new_list = [] 
for i in my_list: 
    if i[1] == 'DT' or i[1] == 'IN': 
     if not sequence_enable: # Start reading values 
      sequence_enable = True 
      temp_str = [] 
     else: # stop reading values 
      new_list.append(' '.join(temp_str)) 
      sequence_enable = False 

     continue 
    else: # store values 
     if sequence_enable: 
      temp_str.append(i[0]) 

print(new_list) 
# output: ['Satisfactory tracing', 'fairly persistent'] 
+0

fantastique - fonctionne pour moi et peut facilement ajouter de nouvelles étiquettes fractionnées. Merci. – brucezepplin

0

Voici quelques pseudo-code et le code réel:

while elements remain in mylist: 
    # Find the next "DT" element 
    look at next element 
    while element[1] is not "DT": 
     look at next element 

    # Watch for "IN"; concatenate elements in the meantime. 
    result = [] 
    look at next element 
    while element[1] is not "IN": 
     result.append(element[0]) 

    # result is a list of the words you want 
    result_conc = ' '.join(result) 

Est-ce que cela vous aide à bouger?

1

C'est une solution:

idt = [item for item in range(len(mylist)) if mylist[item][1] == u'DT'] 
jdt = [item for item in range(len(mylist)) if mylist[item][1] == u'IN'] 

ij = zip(idt,jdt) 

temp_list = [mylist[i[0]+1:i[1]] for i in ij] 

new_list = [str(elem[0][0]+ ' ' + elem[1][0]) for elem in temp_list] 

Il trouve d'abord les indices de u'DT' et u'IN' dans mylist, puis il les zips ensemble dans une liste de tuples, ij. Chaque tuple est le début et la fin de l'intervalle à partir duquel le programme est censé extraire des valeurs. Les valeurs sont d'abord extraites telles qu'elles apparaissent dans mylist en temp_list. La dernière étape constitue la cible new_list qui joint et traite les valeurs extraites stockées dans temp_list.

Cette solution ne vous donne pas les valeurs entre crochets () - il semble que pour ce faire, des éléments de new_list devraient soit être transformé en tuples, à savoir ('Satisfactory tracing',) ou le support devrait être une partie de la chaîne '(Satisfactory tracing)'.

Edition - solution pour un nombre quelconque de chaînes entre DT et IN - tout jusqu'à new_list est le même, new_list est formée par extraction premier élément de chaque élément dans la sous-liste de temp_list et en les joignant en une seule chaîne,

new_list = [((' ').join(map(lambda x: x[0], sub_el))) for sub_el in temp_list] 

Test avec

mylist = [('a', u'DT'), ('Satisfactory', u'JJ'), ('Satisfactory', u'JJ'), 
('tracing', u'VBG'),('with', u'IN'),('a', u'DT'),('fairly', u'RB'), 
('persistent', u'JJ'),('with', u'IN'), ('a', u'DT'),('persistent', u'JJ'), 
('with', u'IN')] 

donne

['Satisfactory Satisfactory tracing', 'fairly persistent', 'persistent'] 
+0

merci pour cela. La dernière commande à créer new_list se plaint de l'écart de l'index de la liste. Je pense que c'est parce que 'temp_list' contient des éléments principalement vides. Je peux voir que vous vouliez 'temp_list' pour récupérer des éléments de' mylist' mais cela n'est pas arrivé et je pense que cela cause l'erreur. – brucezepplin

+0

Content de vous aider. Il n'y avait pas d'erreur pour moi - tout cela a été vérifié avec l'exemple exact que vous avez fourni. Pouvez-vous poster l'exemple qui provoque l'erreur? De même 'temp_list' n'est pas vide du tout. – atru

+0

Je suppose que cela ne sera valide que s'il y a deux éléments entre 'DT' et' IN'. – atru