2015-10-07 2 views
0

У меня есть файл в этом форматеудаления элемента в кортеже в питона

[('misure', 'di', 'protezione'), ('libertà', 'di', 'espressione', 'di', 'popolo')] 

То, что я хочу, чтобы исключить из кортежа предлог (ди), и возвращает результат в том же формате. Так что я создал эту функцию, чтобы сделать это

lista = myfilelist 
prep = prepositionfile 
li = ast.literal_eval(lista) 

for i in li: 
    word = str(i) 
    ll = word.split("', '") 
    for w in ll: 
     lll= w.strip("('')") 
     if lll in prep: 
      i = word.replace(lll, "") 
      i.strip('') 

    print (nonlem(li)) 

но возвращает кортеж в этом формате

[('misure', '', 'protezione'), ('libertà', '', 'espressione', '', 'popolo')] 

Выход Необходим

[('misure', 'protezione'), ('libertà', 'espressione', 'popolo')] ### without '' 
+0

@cdonts то не обязательно проблема, вы всегда можете сделать копию. – maxymoo

ответ

2

Вы можете использовать ast.literal_eval, чтобы превратить строку в список кортежей

>>> from ast import literal_eval 
>>> l = literal_eval("[('misure', 'di', 'protezione'), ('libertà', 'di', 'espressione')]") 

Затем список понимание, чтобы сделать новые кортежи из первого и последнего элемента

>>> [(i[0], i[-1]) for i in l] 
[('misure', 'protezione'), ('libertà', 'espressione')] 

Затем str создать строку из списка кортежей

>>> str([(i[0], i[-1]) for i in l]) 
"[('misure', 'protezione'), ('libertà', 'espressione')]" 

Редактировать
Если вы хотите для удаления всех экземпляров строки 'di' это та же идея, вы можете использовать понимание списка

>>> [tuple(i for i in j if i != 'di') for j in l] 
[('misure', 'protezione'), ('libertà', 'espressione', 'popolo')] 

Edit 2
Даже в более общем случае, если у вас есть set предлогов вы хотите исключить

>>> prepositions = {'di', 'a', 'al'} 
>>> [tuple(i for i in j if i not in prepositions) for j in l] 
[('misure', 'protezione'), ('libertà', 'espressione', 'popolo')] 
+0

Да, но это пример, потому что количество элементов в кортеже может быть больше трех – fff

+0

@gino Затем покажите пример общего случая или нескольких случаев. Я могу работать только с тем, что вы нам говорите, я не могу читать мысли. – CoryKramer

+0

О, так что вы всегда хотите удалить строку '' di''? Хорошо. – CoryKramer

1

Кортеж неизменны, так что вы не можете их изменить после создания. Вы можете создавать новые. Попробуйте это:

[tuple(j for j in i if 'di' not in j) for i in a] 

Here является рабочим демо.

1
[tuple(j for j in i if 'di' != j) for i in li] 

Я изменил sam2090 код, так как строка «ди» может быть частью слова, как «тусклый»

Смежные вопросы