连接属于特定值的列表元素之间的列表元素

时间:2017-10-18 21:31:44

标签: python list split

想象一下,我有以下列表:

>>> 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')]

3 个答案:

答案 0 :(得分: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']

答案 1 :(得分: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]

首先在u'DT'中找到u'IN'mylist的索引,然后将它们一起拉到一个元组列表ij中。每个元组是程序应该从中提取值的间隔的开始和结束。这些值首先在mylist中显示为temp_list时提取。最后一步形成目标new_list,该目标temp_list加入并处理存储在( )中的提取值。

此解决方案不会在括号new_list中为您提供值 - 似乎要实现此目的,('Satisfactory tracing',)的元素必须转换为元组,即'(Satisfactory tracing)'或括号必须是字符串DT的一部分。

编辑 - INnew_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']

产量

{{1}}

答案 2 :(得分: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)

这会让你感动吗?