【问题标题】:Extend/append python join list扩展/附加 python 连接列表
【发布时间】:2023-03-17 08:57:02
【问题描述】:

我有一个例子:

li = [['b', 'b', 'c', '3.2', 'text', '3', '5', '5'], ['a', 'w', '3', '4'], ['a', 'x', '3', '4'],['a','b'],['312','4']]

a = 0
b = []
c = []
count = []
for x in range(len(li)):
    for a in range(len(li[x])):
        if li[x][a].isalpha():
            a += 1
        elif not li[x][a].isalpha() and li[x][a + 1].isalpha():
            a += 1
        else:
            break
    i = (len(li[x]) - a)
    b.extend([' '.join(li[x][0:a])])
    b.extend(li[x][a::])
    count.append(i)


for x in range(len(count)):
    a = count[x] + 1
    z = (sum(count[:x]))
    if x == 0:
        c.append(b[:a])
    else:
        c.append(b[a+1::z])


print(c)

我在li 列表中有各种项目,并且列表本身的长度不是恒定的。 如果数组中的任何元素是一个字符串,或者如果两个字符串之间有其他符号,它会将所有内容组合成一个元素 - 这个连接可以按我的意愿工作。

我想保留现有结构。例如,现在的输出如下所示:

[['b b c 3.2 text', '3', '5', '5'], ['a w', 'a x', 'a b', '4'], ['a w', '4'], ['5', '4'], ['a w', '']]

但它应该是这样的:

[['b b c 3.2 text', '3', '5', '5'],['aw','3','4'],['ax','3','4'],['ab'],['312','4']

当然,我发送的代码不能正常工作 - 我想到了一个解决方案,但我仍然有一些问题 - 我不知道如何将范围添加到此列表中 c - 我尝试拉长列表中的元素为count,但它对我也不起作用-也许这是一个糟糕的解决方案?也许这个扩展b 不是最好的解决方案?也许使用这么多“转换”并创建新列表没有意义? 给我一些建议。

【问题讨论】:

  • 如果字符串之间有数字怎么办?
  • 在执行过程中找到变量状态不符合预期的第一个点并说出原因。 (调试基础。)
  • @komatiraju032 如果一个数字在字符串之间,它应该被附加 - 但我认为我不会有像这样的工作连接的其他情况。我只是想保持原来的 post join 结构,但我不知道具体该怎么做。
  • ['a', 'b', 1, 2, 3, 4, 'c', 5, 'd'] 的输出是什么?
  • @philipxy 您是否提出了一个带有一些 True / False 标志的解决方案,然后更改此列表?我考虑过,但这个解决方案可能也与计算一个列表中应该包含的元素数量有关,但我仍然有问题。

标签: python list extend


【解决方案1】:

这个定义对我来说有点不清楚,但我认为这样就可以了。不过,代码不是很冗长。如果它符合您的预期,我可以尝试解释/使其更简单。

li = [['b', 'b', 'c', '3.2', 'text', '3', '5', '5'], ['a', 'w', '3', '4'], ['a', 'x', '3', '4'],['a','b'],['312','4']]

def join_to_last_text(lst: list, min_join: int = 1) -> list:
    last_text = max((i for i,s in enumerate(lst) if s.isalpha()), default=min_join - 1)
    return [' '.join(lst[:last_text + 1])] + lst[last_text + 1:]

output = [join_to_last_text(lst) for lst in li]
print(output)

# You can join a minimum of first items by setting a higher max default.
# If max does not find isalpha, it will use this value.
output_min_2 = [join_to_last_text(lst, min_join=2) for lst in li]
print(output_min_2)

【讨论】:

  • 如果列表以数字['312','4', 'x', 'y']开头将不起作用
  • 这个解决方案非常好。谢谢你。我可以解释一下这个结构吗:(lst: list) -> list: - 或者一些教程?这像 C++ 中的指针吗?如果我想添加一个额外的 if 怎么办 - 即,如果第一个元素是 3 位数字,第二个元素是数字,那么它应该组合 - ['123', '456', '1','123','431'] - 输出:['123 456', '1', '123', '431']。如果第一个元素是一个数字字符并且它的长度是 3,并且列表的下一个元素也是一个数字,那么通常的条件是加入吗?它会以这种方式工作还是以不同的方式工作?
  • @komatiraju032 看看我的回答。
  • @DeepSea 这基本上是在告诉变量的数据类型。 def func(a: b) 表示在函数func 中,参数a 的类型为b。而def func(a,b) -> c 表示函数func 返回一个c 类型的值
  • @DeepSea:这些被称为类型注释。它将帮助正在查看代码的任何人了解预期的类型。如果您使用现代 IDE,它可能支持这些,并且会告诉您是否使用错误类型调用方法。
【解决方案2】:

@Johan Schiff 的代码按预期工作,但留下了一个极端情况 - 当列表的第一个元素不是文本时。我对他的代码做了一些小改动来处理这种情况:

li = [['b', 'b', 'c', '3.2', 'text', '3', '5', '5'], ['a', 'w', '3', '4'], ['a', 'x', '3', '4'],['a','b'],['312','4']]

def join_to_last_text(lst: list) -> list:
    first_text = min((i for i,s in enumerate(lst) if s.isalpha()), default=0)
    last_text = max((i for i,s in enumerate(lst) if s.isalpha()), default=0)
    return lst[:first_text] + [''.join(lst[first_text:last_text + 1])] + lst[last_text + 1:]

output = [join_to_last_text(lst) for lst in li]
print(output)

这会在哪里给出不同的输出(正确的输出)?查看以下测试用例:

li = [['4','b', 'b', 'c', '3.2', 'text', '3', '5', '5'], ['a', 'w', '3', '4']]

@Johan 的代码会输出 -

[['5bbc3.2text', '3', '5', '5'], ['aw', '3', '4']]

而基于问题中的以下短语

如果数组中的任何元素是一个字符串,或者如果两个字符串之间有其他符号,它会将所有元素组合成一个元素

输出应该是-

[['5', 'bbc3.2text', '3', '5', '5'], ['aw', '3', '4']]

【讨论】:

  • 请看我的comment
  • @DeepSea 我不明白你到底想说什么。尽管我已经理解这一点-您想添加其他条件。条件是 - 如果前两个元素是三位数字(字符串形式的 ofc),则将它们连接起来。是你想问的吗?
  • 不错的调整。显然,这取决于你想要什么结果。这就是我所说的定义不清楚的意思。 :)
  • @paradoxlover yes 例如:li = [['456','2341','0','2','4'], ['a', 'w', '3', '4']] 输出应该是:[['456 2341', '0','2','4'],['a w', '3', '4']] 或者我写的解决方案 - 检查isalpha 然后是一个字符串 - 在这种情况下,如果第一个元素是数字长度为>= 2 的字符,并且下一个元素也是长度为>= 2 的数字字符,则应将其组合。在哪里添加这样的inf 仅用于列表中的[0] 元素?
  • 我解决了这个问题 - 只需添加正则表达式 regex = re.compile('\+|^\d\w|[a-zA-Z]\d|\w\/\w'),然后在 if 语句上添加 or regex.match(s)
猜你喜欢
  • 2021-11-05
  • 1970-01-01
  • 2015-03-19
  • 2012-02-18
  • 2014-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-06
相关资源
最近更新 更多