【问题标题】:Joining strings with a list of lists if they meet a specific condition如果满足特定条件,则将字符串与列表列表连接
【发布时间】:2021-09-24 22:15:22
【问题描述】:

我有这个列表:

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

非常感谢任何帮助!

【问题讨论】:

  • 它们总是出现在最后三个位置吗?
  • 它们总是连续的吗?
  • 我希望他们不被逼到最后的位置。他们可能并不总是处于最终位置......这是一个很好的观点。

标签: python list for-loop if-statement indexing


【解决方案1】:

试试这个线性列表理解:

[[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.takewhileitertools.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']]

它按预期工作。

【讨论】:

  • 这将导致 "M, F, W" 部分始终位于列表的末尾,即使它出现在原始列表的中间
  • 我已经尝试了 4 个小时......我觉得......非常感激谢谢
  • @SamSchneider 欢迎您,如果有帮助,请接受并投票 :)
  • @SamSchneider 会有2组特殊字符的情况吗?
  • 我的第二点应该是:并且通过使用sublist[sublist.index(b[-1]) + 1:],当第一组b 中的最后一项在列表中出现多次时,代码将失败。例如,尝试:x = [[1, "hello", 1, 'M','F','W', "drugs"]],它会在您的代码中输出 [[1, 'hello', 1, 'M,F,W', 'hello', 1, 'M', 'F', 'W', 'drugs']]
【解决方案2】:

你可以试试set

[[*set(i).difference([ 'M','F','W','S','Su']), ','.join(set(i).intersection([ 'M','F','W','S','Su']))] for i in x]
[['hello', 1, 'pacific', 'F,W,M'], ['yes', 4, 5, 'turn', 'F,S,Su']]

【讨论】:

    【解决方案3】:

    您可以使用itertools.groupby 将属于您要查找的关键项目之一的连续项目组合在一起,这样您就可以将它们连接成一个逗号分隔的字符串,同时将其他项目分开:

    from itertools import groupby
    
    x = [
        ["hello", 1, 'M', 'F', 'W', "pacific", "S", "Su", "no"],
        ["yes", 4, 5, "turn", 'S', 'F', 'Su']
    ]
    keys = {'M', 'F', 'W', 'S', 'Su'}
    print([
        [
            i
            for k, g in groupby(lst, keys.__contains__)
            for i in ([','.join(g)] if k else g)
        ] for lst in x
    ])
    

    这个输出:

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

    【讨论】:

      猜你喜欢
      • 2019-11-03
      • 1970-01-01
      • 2021-07-26
      • 1970-01-01
      • 2021-07-04
      • 2017-04-30
      • 1970-01-01
      • 2020-06-27
      • 1970-01-01
      相关资源
      最近更新 更多