[英]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.