2015-12-16 2 views
1

Вот мой (рабочий) Код:Python: найти общие буквы в массиве, не разрезая слово

groupes = [{'description': 'i am a letter', 'exemple': 'e1'}, 
      {'description': 'i am a brick', 'exemple': 'e2'}, 
      {'description': 'i am a dog', 'exemple': 'e3'}] 
d = zip(*[g['description'] for g in groupes]) 
b = [] 
for a in d: 
    if len(set(a)) == 1: 
     b.append(set(a).pop()) 
    else: 
     break 
a = u''.join(b) 
l = len(a) 
print() 
b = [u'{} "{}"'.format(b['description'][l:], b['exemple']) for b in groupes] 
b = u', '.join(b).strip() 
print(u'{} ({})'.format(a, b)) 

Он выводит все буквы в общем, и с Reste, поместите его в () на примере. Моя проблема в том, когда буквы в общей остановке в середине слова, как это:

groupes = [{'description': 'i am a douche', 'exemple': 'e1'}, 
      {'description': 'i am a dandy', 'exemple': 'e2'}, 
      {'description': 'i am a dog', 'exemple': 'e3'}] 

Тогда вы получите:

i am a d (ouche "e1", andy "e2", og "e3") 

В то время как я хочу, чтобы получить

i am a (douche "e1", dandy "e2", dog "e3") 

Любая идея, как это сделать «путь python»?

ответ

0

добавить:

if any(' ' != c for c in next(d,[])): 
    while b[-1] != ' ': 
     b.pop() 

после for цикла. Это:

  • проверяет наличие символов в следующем наборе символов, которые не являются пробелами. Если есть, это означает, что существует по крайней мере одно слово отрежет
  • выскакивают любые символы, которые ARENT пробелов из конца б
  • , если все 3 строк идентичны, next() обычно вызывает ошибку StopIteration так сделать обязательно иметь [] по умолчанию

Кроме того, вы должны изменить print(u'{} ({})'.format(a, b)) к print(u'{}({})'.format(a, b)), чтобы избежать дополнительного пространства перед ( в вашей печатной строке.

EDIT - лучший способ?

возможно более вещий способ, чем это, чтобы изменить свою zip к этому:

d = zip(*[g['description'].split() for g in groupes]) 

разделить каждую строку и вместо того, чтобы итерационное слово за словом, вместо interating письма.

Просто убедитесь, что изменить join, а также к:

a = u' '.join(b) #space instead of empty string 

EDIT - почему * звезда?

Это используется для распаковки аргументов. Обратите внимание на разницу между пропусканием списка (или в большинстве случаев, любая итерации) с и без *:

>>> def foo(a= None, b = None, c = None): 
    print(''' 
    a: %s 
    b: %s 
    c: %s 
    ''' %(str(a),str(b),str(c))) 


>>> test = [1,2,3] 
>>> foo(test) 

    a: [1, 2, 3] 
    b: None 
    c: None 

>>> foo(*test) 

    a: 1 
    b: 2 
    c: 3 
+0

С вашим вторым раствором, если я пытаюсь с «pelh» и «помощью», а затем установить («pehl») == set ('help'), тогда я могу получить «true», хотя слова не совпадают. Я прав? –

+0

Да, но помните, что вы вызываете 'set' на возвращаемый объект из' zip'. Поэтому скажите, что ваши описания «help» и '' hepl'', тогда 'set (a)' в вашем коде эквивалентен 'set (('help', 'hepl'))', который все равно даст вам длина 2 с «help»!= 'hepl'' –

+0

Другими словами, он все равно будет работать; Я пробовал и тестировал его :) –

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