如何在迭代另一个列表时填充新列表?

Posted

技术标签:

【中文标题】如何在迭代另一个列表时填充新列表?【英文标题】:How to fill a new list while iterating over another list? 【发布时间】:2020-03-30 10:01:28 【问题描述】:

代码

#Variables
var1 = ['Warehouse Pencil 1.docx', 'Production Pen 20.docx']

list1 = []
for x in var1:
    splitted = x.split()
    a = [splitted[0] + ' ' + splitted[1]]
    list1.append(a)
    print(list1)

输出

[['Warehouse Pencil']]
[['Warehouse Pencil'], ['Production Pen']]

目标

我打算拆分列表,获取每个部分的第一个和第二个单词,并将它们放入一个新列表中。

问题

为什么我的输出给了我一个奇怪的输出?我哪里错了?

期望的输出

我想要的输出应该是这样的:

['Warehouse Pencil', 'Production Pen']

抓取第一个和第二个单词并将它们放入 1 个列表中。

【问题讨论】:

去掉a = splitted[0] + ' ' + splitted[1]周围的括号 【参考方案1】:

这应该可以解决它 - 将 print 语句移出循环,并使 a 成为字符串而不是列表。

#Variables
var1 = ['Warehouse Pencil 1.docx', 'Production Pen 20.docx']

list1 = []
for x in var1:
    splitted = x.split()
    a = splitted[0] + ' ' + splitted[1]
    list1.append(a)
print(list1)

输出:

['Warehouse Pencil', 'Production Pen']

您也可以使用列表推导:

>>> [' '.join(x.split()[:2]) for x in var1]
['Warehouse Pencil', 'Production Pen']

【讨论】:

谢谢,我看到你删除了[] 并且还移动了打印的缩进。在这种情况下,缩进有什么影响?只是好奇 @LV98 缩进在这里很重要,否则每次for 循环运行时都会打印列表list1。将其移出该循环意味着它仅在循环结束后打印一次。 感谢您的解释!还有列表理解发生了什么? 列表推导基本上是一种压缩循环的方法,将列表填充到一行中。你可以阅读更多关于他们的信息here【参考方案2】:

您也可以使用方法str.rfind(sub)。它返回字符串中找到子字符串sub(在您的情况下为空格)的最高索引:

[i[:i.rfind(' ')] for i in var1]
# ['Warehouse Pencil', 'Production Pen']

或者,您可以使用方法str.rsplit()。它从右边开始拆分字符串:

[i.rsplit(maxsplit=1)[0] for i in var1]
# ['Warehouse Pencil', 'Production Pen']

【讨论】:

【参考方案3】:

获取文件名。 我们可以使用以下方法。

import pathlib

var1 = ['Warehouse Pencil 1.docx', 'Production Pen 20.docx']
file_name = []

for i in var1:
    p = pathlib.Path(i)
    file_name.append(p.stem)
    
print(file_name)
['Warehouse Pencil 1', 'Production Pen 20']

[Program finished]

【讨论】:

【参考方案4】:

list.extend()

由于其他答案中未提及此关键字,因此您可以扩展列表而不是附加它。

var1 = ['Warehouse Pencil 1.docx', 'Production Pen 20.docx']

list1 = []
for x in var1:
    splitted = x.split()
    a = [splitted[0] + ' ' + splitted[1]]
    list1.extend(a)  # Notice the difference here! 
print(list1)

【讨论】:

以上是关于如何在迭代另一个列表时填充新列表?的主要内容,如果未能解决你的问题,请参考以下文章

如何在正文视图中使用计数器来填充列表

在同一页面上提交表单时如何预填充下拉列表?

WPF 列表框动态填充 - 如何让它刷新?

如何使用惯用的Scala替换(填充)来自另一个列表的选项列表中的None条目?

如何在不更改原始列表的情况下更改新列表?

如何使用第一个下拉列表的 onChange 事件填充另一个下拉列表?