2017-10-18 91 views
-1

想象我有以下列表:落在一定值的列表元素之間串聯列表中的元素

>>> mylist 

[('a', u'DT'), 
('Satisfactory', u'JJ'), 
('tracing', u'VBG'), 
('with', u'IN'), 
('a', u'DT'), 
('fairly', u'RB'), 
('persistent', u'JJ'), 
('with', u'IN')] 

如何串連落在包含u'IN'u'DT'僅返回級聯元素,即元素之間的列表項:

[('Satisfactory tracing'), 
('fairly persistent')] 
+0

@engr_s這是結果的第二個元素:'('相當持久')' – Barmar

+0

嘗試使用itertools.dropwhile()和itertools.takewhile()。 –

回答

1

這是一個會給你想要的結果。也許你需要優化一下。

my_list = ([('a', u'DT'), 
      ('Satisfactory', u'JJ'), 
      ('tracing', u'VBG'), 
      ('with', u'IN'), 
      ('a', u'DT'), 
      ('fairly', u'RB'), 
      ('persistent', u'JJ'), 
      ('with', u'IN')]) 

sequence_enable = False 
new_list = [] 
for i in my_list: 
    if i[1] == 'DT' or i[1] == 'IN': 
     if not sequence_enable: # Start reading values 
      sequence_enable = True 
      temp_str = [] 
     else: # stop reading values 
      new_list.append(' '.join(temp_str)) 
      sequence_enable = False 

     continue 
    else: # store values 
     if sequence_enable: 
      temp_str.append(i[0]) 

print(new_list) 
# output: ['Satisfactory tracing', 'fairly persistent'] 
+0

夢幻般的 - 適合我的作品,並且可以輕鬆添加新的分組標籤。謝謝。 – brucezepplin

0

下面是一些僞代碼和實際代碼:

while elements remain in mylist: 
    # Find the next "DT" element 
    look at next element 
    while element[1] is not "DT": 
     look at next element 

    # Watch for "IN"; concatenate elements in the meantime. 
    result = [] 
    look at next element 
    while element[1] is not "IN": 
     result.append(element[0]) 

    # result is a list of the words you want 
    result_conc = ' '.join(result) 

這會讓你感動嗎?

1

這是一個解決辦法:

idt = [item for item in range(len(mylist)) if mylist[item][1] == u'DT'] 
jdt = [item for item in range(len(mylist)) if mylist[item][1] == u'IN'] 

ij = zip(idt,jdt) 

temp_list = [mylist[i[0]+1:i[1]] for i in ij] 

new_list = [str(elem[0][0]+ ' ' + elem[1][0]) for elem in temp_list] 

它首先發現的mylistu'DT'u'IN'指數,那麼它呼嘯而過它們一起放到ij元組的列表。每個元組是程序應該從中提取值的時間間隔的開始和結束。這些值首先被提取,因爲它們出現在mylisttemp_list中。最後一步形成連接並處理存儲在temp_list中的提取值的目標new_list

這種解決方案並不會給你括號內()值 - 似乎實現這一點,new_list元素要麼必須變成元組,即('Satisfactory tracing',)或支架必須是字符串'(Satisfactory tracing)'的一部分。

編輯 - 爲DTIN之間的任何數量的字符串溶液 - 一切直到new_list是相同的,new_list是通過從在temp_list子列表的每個元素中提取第一元件,並將它們加入到一個串形成,

new_list = [((' ').join(map(lambda x: x[0], sub_el))) for sub_el in temp_list] 

測試與

mylist = [('a', u'DT'), ('Satisfactory', u'JJ'), ('Satisfactory', u'JJ'), 
('tracing', u'VBG'),('with', u'IN'),('a', u'DT'),('fairly', u'RB'), 
('persistent', u'JJ'),('with', u'IN'), ('a', u'DT'),('persistent', u'JJ'), 
('with', u'IN')] 

產生

['Satisfactory Satisfactory tracing', 'fairly persistent', 'persistent'] 
+0

謝謝你。創建new_list的最後一個命令會抱怨列表索引超出範圍。我想這是因爲'temp_list'主要包含空元素。我可以看到你想'temp_list'從mylist中提取asis元素,但是這並沒有發生,我認爲這會導致錯誤。 – brucezepplin

+0

很高興提供幫助。對我來說沒有錯誤 - 所有這些都是通過您提供的確切示例進行檢查的。你能發佈導致錯誤的例子嗎?而且'temp_list'根本不是空的。 – atru

+0

我想這隻會在'DT'和'IN'之間有兩個元素時纔有效。 – atru

相關問題