2017-09-05 40 views
0

我有一個字典如下:使用列表理解從參考元素添加到字符串字典

s = {'lorem': set(['test1', 'test2'])} 

和文本文件,如下所示:

data = "Lorem ipsum dolor sit amet consectetur adipiscing elit" 

我寫了一個腳本如下:

[[word, s[word]] if word in s else word for word in data.lower().split()] 

,輸出看起來像下面的列表:

[['lorem', set(['test1', 'test2'])], 'ipsum', 'dolor', 'sit', 'amet', 'consectetur', 'adipiscing', 'elit'] 

我怎樣才能把上面的腳本輸出以下列表:

['lorem', 'test1', 'test2', 'ipsum', 'dolor', 'sit', 'amet', 'onsectetur', 'adipscing', 'elit'] 
+0

@TheoretiCAL - 是的,絕對要保持原來的「lorem」 –

+0

然後它不被視爲「替換」,而是添加文字。請更正描述,因爲這是誤導性的。 – alfasin

+0

好@alfasin - 將更新以反映這一點。 –

回答

4

您可以展開在列表理解的右側設置的。使用dict.get而不是測試在字典項目的遏制:

lst = [w for word in data.lower().split() for w in [word] + list(s.get(word,()))] 
print(lst) 
# ['lorem', 'test1', 'test2', 'ipsum', 'dolor', 'sit', 'amet', 'consectetur', 'adipiscing', 'elit'] 
+1

這很酷!我沒有意識到你可以這樣做...真棒,如此優雅...謝謝你! –

0

你可以試試這個:

from itertools import chain 
s = {'lorem': set(['test1', 'test2'])} 

data = "Lorem ipsum dolor sit amet consectetur adipiscing elit" 

new_data = [[i, list(s[i.lower()])] if i.lower() in s else [i] for i in data.split()] 
final_data = list(chain.from_iterable([list(chain.from_iterable([[c] if not isinstance(c, list) else c for c in i])) if any(isinstance(b, list) for b in i) else i for i in new_data])) 

輸出:

['Lorem', 'test1', 'test2', 'ipsum', 'dolor', 'sit', 'amet', 'consectetur', 'adipiscing', 'elit']