首页 > 解决方案 > 如果满足特定条件,则将字符串与列表列表连接

问题描述

我有这个列表列表:

x = [["hello", 1, "pacific", 'M','F','W'], ["yes", 4, 5, "turn", 'S', 'F', 'Su']]

我想加入列表中的特定项目:'M','F','W','S','Su'

因此,如果列表中存在这些项目中的任何一项,则应将它们连接在一起,从而导致:

x = [["hello", 1, "pacific", 'M,F,W'], ["yes", 4, 5, "turn", 'S,F,Su']]

我当前的尝试如下所示:

x = [["hello", 1, "pacific", 'M','F','W'], ["yes", 4, 5, "turn", 'S', 'F', 'Su']]

z = []

for item in x: 

    for y in item:

        if y == 'M' or y == 'F' or y =='W' or y == 'S' or y =='Su':

            item.index(y)

            z.append((item.index(y)))

        else:
            pass

x[min(z):max(z)+1] = [','.join(item[min(z):max(z)+1])]

print(x)

我想我可以在列表中获取我想要的特定字符串的位置,然后使用 min 和 max 加入它们。

我的代码返回:

[['hello', 1, 'pacific', 'M', 'F', 'W'], ['yes', 4, 5, 'turn', 'S', 'F', 'Su'], 'turn,S,F']

很感谢任何形式的帮助!

标签: pythonlistfor-loopif-statementindexing

解决方案


试试这个线性列表理解:

[[i for i in sublist if i not in l] + [','.join([i for i in sublist if i in l])] for sublist in x]

输出:

[['hello', 1, 'drugs', 'M,F,W'], ['yes', 4, 5, 'turn', 'S,F,Su']]

完整代码:

x = [["hello", 1, "drugs", 'M','F','W'], ["yes", 4, 5, "turn", 'S', 'F', 'Su']]
l = ['M', 'F', 'W', 'S', 'Su']
print([[i for i in sublist if i not in l] + [','.join([i for i in sublist if i in l])] for sublist in x])

这只是遍历列表,并在每个子列表中提取不在l列表中的所有字符串,并添加一个值作为最后一个元素,该元素是一个字符串,子列表中的字符串也在列表中,l并用逗号连接和分隔.

编辑:

由于知道特定项目不会总是在最后,您可以尝试使用itertools.takewhileand itertools.dropwhile

我稍微修改了您的列表(移动特定项目的位置),以证明我的代码有效:

from itertools import takewhile, dropwhile
x = [["hello", 1, 'M','F','W', "drugs"], ["yes", 4, 5, 'S', 'F', 'Su', "turn"]]
l = ['M', 'F', 'W', 'S', 'Su']
newlist = []
for sublist in x:
    b = list(takewhile(lambda x: x not in l, sublist))
    newlist.append(b + [','.join([i for i in sublist if i in l])] + list(dropwhile(lambda x: x in l, sublist[len(b):])))
print(newlist)

输出:

[['hello', 1, 'M,F,W', 'drugs'], ['yes', 4, 5, 'S,F,Su', 'turn']]

它按预期工作。


推荐阅读