繁体   English   中英

Python 连接列表列表中的连续 True 值

[英]Python Concatenate consecutive True values in list of lists

我有一个列表,其中每个项目也是一个列表。 每个项目都包含一些值,然后是 True 或 False 值。

例如

list = [ 
['purple', False], 
['yellow', True], 
['red', True], 
['blue', False] 
['green', True], 
['orange', True], 
['black', True],
['cyan', False]
]

所需的 output 是连接任何连续出现的 True 值,如下所示:

desired_list = [ 
['purple', False], 
['yellowred', True], 
['blue', False] 
['greenorangeblack', True], 
['cyan', False]
]

例如,“黄色”和“红色”现在都作为单个字符串存在。

提前感谢您的帮助

没有itertools解决方案

data = [ 
['purple', False], 
['yellow', True], 
['red', True], 
['blue', False],
['green', True], 
['orange', True], 
['black', True],
['cyan', False]
]

out = []
prev = False
for i in data:
    if not prev or not i[1]:
        out.append(i)
    else:
        out[-1][0] += i[0]
    prev = i[1]

print(out)

[['purple', False], 
['yellowred', True], 
['blue', False], 
['greenorangeblack', True], 
['cyan', False]]

您可以使用itertools package 中的groupby和列表理解来执行此操作。 下面的groupby按每个项目的最后一个元素将列表中的项目组合在一起。 for 循环遍历每个分组,合并字符串,并添加 True/False。

from itertools import groupby

x = [ 
['purple', False], 
['yellow', True], 
['red', True], 
['blue', False],
['green', True], 
['orange', True], 
['black', True],
['cyan', False]
]


[[''.join(e[0] for e in g), k] for k, g in groupby(x, key=lambda x: x[-1])]
# returns:
[['purple', False],
 ['yellowred', True],
 ['blue', False],
 ['greenorangeblack', True],
 ['cyan', False]]

您可以通过递归很好地解决它:

def compress(list_, i):
if i + 1 == len(list_):
    return
if list[i][1] and list[i+1][1]:
    list[i][0] += list[i+1][0]
    del list[i+1]
    compress(list_, i)
compress(list_, i + 1)

这不会创建另一个列表。 它修改现有列表。

list = [
['purple', False],
['yellow', True],
['red', True],
['blue', False],
['green', True],
['orange', True],
['black', True],
['cyan', False]
]

for item in list:
    i_now = list.index(item)
    if item[1]:
        while list[i_now+1][1]:
            item[0] = item[0] +'-'+ list[i_now+1][0]
            list.remove(list[i_now+1])
print(list)

尝试使用这个 function:

def get_concatenated(my_list):
    result = []
    concatenated_string = ''
    for i, item in enumerate(my_list):
        if item[1]:
            concatenated_string += item[0]

            # if last element is true
            if i == len(my_list) - 1:
                result.append([concatenated_string, True])

            continue

        if concatenated_string:
            result.append([concatenated_string, True])

        result.append(item)
        concatenated_string = ''

    return result

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM