2013-05-26 93 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 

,並希望創建一個使用值L1如果存在一個Python(2.7)名單,否則通通過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'] 

這是正確的。

-------編輯 因此,在下面Jon的答案中,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

Works爲你的榜樣

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

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

較籠統的一個可者進行調整:

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)for a,b in 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

我不知道我可以指望總是分開逗號空間的列表。我會更新這個問題。 –