2013-05-26 3 views
3

У меня есть две строки:Python для фильтрации через запятую список в другой список CSV

s1 = "Brendon, Melissa, Jason, , McGuirk" #the gauranteed string in format "x, y, z" 
s2 = "brandon,melissa,jxz ,paula,coach" #the messy string 

и хотел бы создать список Python (2.7), который использует значение в l1, если он существует, в противном случае переходите через значение в l2. У меня есть рабочий код, но даже со списком понятий, я чувствую, что может быть более Pythonic способ сделать это. Какие-нибудь идеи, что это может быть?

l1 = [x.strip() for x in s1.split(',')] 
l2 = [x.strip() for x in s2.split(',')] 
f = lambda s: s[1] if s[1] else s[0] 
final = [f(x) for x in zip(l2, l1)] 

список "окончательный" теперь содержит:

['Brendon', 'Melissa', 'Jason', 'paula', 'McGuirk'] 

Который является правильным.

------- редактировать Итак, глядя на ответ Джона ниже, a или b кажется самым простым и понятным способом. Я переместил чистку струн в маленькую функцию, и в итоге получился. Любые дальнейшие улучшения?

trim_csv = lambda csv: [s.strip() for s in csv.split(',')] 
print [a or b for a, b in zip(trim_csv(s1), trim_csv(s2))] 
+0

Что делать, если не хватает значения в обоих s1 и s2? Два ответа, которые я вижу по этому сообщению, возвращают список длины-4 (т.е. они его отбрасывают). – Spacedman

+1

@Spacedman Они не бросают его - они сохраняют элемент как '' '' –

+0

Нет, если между запятыми нет пробела - возможно, потому, что вы разделились на« запятую » – Spacedman

ответ

6

Работы для вашего примера

s1 = "Brendon, Melissa, Jason, , McGuirk" 
s2 = "brandon, melissa, jxz, paula, coach" 

print [a or b for a, b in zip(s1.split(', '), s2.split(', '))] 

Чуть более общий характер, который может быть adapated:

import re 
from itertools import izip_longest, ifilter, imap 

s1 = "Brendon, Melissa, Jason, , McGuirk" 
s2 = "brandon, melissa, jxz, paula, coach" 


def take_first_not_empty(*args): 
    splitter = re.compile(r'\s*?,\s*').split 
    words = imap(splitter, args) 
    return [next(ifilter(None, vals), '') for vals in izip_longest(*words, fillvalue='')] 
+1

«или» - это ответ. – georg

+0

+1 для использования 'или'. –

+0

Я не уверен, что понимаю использование вашего общего примера. Я попытался: [take_first_not_empty (a, b) для a, b в zip (s1.split (','), s2.split (','))] И он вернул список элементов в виде отдельных списков. например: [['Brendon'], ['Melissa'], ['Jason'], ['paula'], ['McGuirk']] –

2

Нечто подобное?

>>> s1 = "Brendon, Melissa, Jason, , McGuirk" 
>>> s2 = "brandon, melissa, jxz, paula, coach" 
>>> [x if x else y for x,y in zip(s1.split(', '),s2.split(', '))] 
['Brendon', 'Melissa', 'Jason', 'paula', 'McGuirk'] 
+0

Я не уверен, что могу рассчитывать на списки, всегда разделяемые запятой. Я уточню вопрос. –

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