2014-04-06 29 views
5

對不起,這個模糊的標題很難解釋清楚。分割每個第n個字符串元素併合併到數組中的最佳方法?

基本上,想象我有一個列表(在Python),看起來像這樣:

['a', 'b', 'c\nd', 'e', 'f\ng', 'h', 'i'] 

從這一點,我想這一點:

['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i'] 

一個辦法,我想這樣做的這是使用reduce像這樣:

reduce(lambda x, y: x + y.split('\n'), lst, []) 

但我不認爲這是非常有效的,因爲它沒有利用我們知道每個第n個元素都有分隔符的事實。有什麼建議麼?

編輯:關於如何構造數組的更多背景,這可能是問題所在。

我在格式文本:

Ignorable line 
Field name 1|Field name 2|Field name 3|Field name 4 
Value 1|Value 2|Value 3|Value 4 
Value 1|Value 2|Value 3|Value 4 
... 

我們可以去那裏字段名的任意量,也總會數量相等值的行的字段名。請注意,我們可以在值中添加新行。我們只知道會被'|'分開。所以我們可以有

Value 1|This is an long 
value that extends over multiple 
lines|Value 3|Value 4 

我怎麼做目前這是做一個s.split('\n', 2),使我們得到自己的字符串在自己的字符串字段名稱,和值。然後,當用'|'分割值時,我們得到我最初提到的表格的列表。

+1

你是什麼意思的每第n個元素......它看起來像

你的n從3變到2 ......除了它可能快很多......除非它實際上不是,但在那種情況下你會知道那是你的瓶頸......過早優化是所有邪惡的根源 –

+1

在示例中,\ n總是跟隨第三項(c是字母表的第三個字母; f是第六個)。我很好奇,是什麼原因導致你以這種格式獲得最初的列表。如果你改變了你構建原始列表的方式,那麼代碼可能會更乾淨......這感覺就像一個破解解析器的解決方法。 – ramcdougal

+0

@ramcdougal它可能是它不是構建該列表的最佳方式。我會以這種形式更新帖子。 – mp94

回答

10

你可以做('\n'.join(lst)).split()獲得第二個列表。

In [17]: 

%timeit reduce(lambda x, y: x + y.split('\n'), lst, []) 
100000 loops, best of 3: 9.64 µs per loop 
In [18]: 

%timeit ('\n'.join(lst)).split() 
1000000 loops, best of 3: 1.09 µs per loop 

感謝@Joran比斯利的建議split()split('\n')

編輯

現在我看到更新的問題,我認爲我們能夠避免陷入這樣的情況在開始的時候,看到(使用re):

In [71]: 

L=re.findall('([^|]+)\|', 
      ''.join(['|'+item+'|' if item.count('|')==3 else item for item in S.split('\n')[1:]])+'|') 
In [72]: 

zip(*[L[i::4] for i in range(4)]) #4 being the number of fields. 
Out[72]: 
[('Field name 1', 'Field name 2', 'Field name 3', 'Field name 4'), 
('Value 1', 'Value 2', 'Value 3', 'Value 4'), 
('Value 1', 
    'This is an longvalue that extends over multiplelines', 
    'Value 3', 
    'Value 4')] 

看起來像SAS最初的數據集, 我對嗎?

+0

這絕對快得多,但其他元素中可能還有新行(可能是多個未知量)。我會用這些信息更新這篇文章。 – mp94

+0

有機會解決問題嗎?如果沒有,請參閱編輯。 –

+0

我做過了,但是這也可以。我解析的輸出實際上是使用Linux上的wmic實用程序的WQL查詢的請求。見http://www.aldeid.com/wiki/Wmic-linux – mp94

2

過早優化是所有罪惡

,如果你正在遭受的因爲這段代碼多數民衆贊成在一件事性能問題的根源,但我懷疑你。當你優化你經常犧牲可讀性我會做什麼,如果它是我

list(itertools.chain(*[item.split() for item in lst])) 

這是很清楚你在做什麼

+1

嗨喬蘭,你確定這會工作嗎?我認爲它應該是'list(itertools.chain(* [item.split()for item in lst]))' –

+0

ahh你完全正確你的答案在清晰度方面更好我認爲無論如何(「雖然id可能只是使用沒有分隔符的正常分割,但是meh) –

相關問題