2016-01-23 90 views
1

我覺得這個問題的答案不是很複雜,但我不能爲我的生活弄清楚。從字典列表中切出每個字典中的字符串值?

我有一個詞典的列表。字典中的鍵是整數(0, 1, 2)。這些值是包含無關信息的字符串,括號中包含相關信息。我想分割這些字符串,以便括號內的內容是新的值。我想以這種方式更新每個字典,然後將每個字典打包回其列表中。

讓我們假設這是我有:

Original = [{1: 'xxx [pear] yyy', 2: 'xxx [apple] zzz'}, {0: 'aaa [cat] yyy', 1: 'bbb [dog] zzz'}] 

這是我希望我的函數返回的內容:

[{1: 'pear', 2: 'apple'}, {0: 'cat', 1: 'dog'}] 

我怎麼會去這樣做呢?編輯:我知道怎麼給字符串如下:

slicev = v.split('[', 1)[1].split(']')[0]

+0

你爲什麼不直接使用正則表達式? – Chaker

回答

1
def find_between(s, first, last): 
    try: 
     start = s.index(first) + len(first) 
     end = s.index(last, start) 
     return s[start:end] 
    except ValueError: 
     return "" 

original = [{1: "xxx [pear] yyy", 2: "xxx [apple] zzz"}, {0: "aaa [cat] yyy", 1: "bbb [dog] zzz"}] 

for dct in original: 
    for key in dct: 
     dct[key] = find_between(dct[key], "[", "]") 
0

你可以使用正則表達式

import re 
Original = [{1: "xxx [pear] yyy", 2: "xxx [apple] zzz"}, {0:" aaa [cat] yyy", 1: "bbb [dog] zzz"}] 
for item in Original: 
    for key in item: 
     item[key]= re.findall("\[(.*?)\]",item[key])[0] 

print Original 

結果

[{1: 'pear', 2: 'apple'}, {0: 'cat', 1: 'dog'}] 

要注意的是這將改變原始列表。

0

我覺得re模塊可以幫助你:

import re 

original = [{1: 'xxx [pear] yyy', 2: 'xxx [apple] zzz'}, 
      {0: 'aaa [cat] yyy', 1: 'bbb [dog] zzz'}] 

data = [{k: re.search(r'\[(.*?)\]', v).group(1) for k, v in d.items()} 
     for d in original]