如何在迭代另一个列表时填充新列表?
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)
【讨论】:
以上是关于如何在迭代另一个列表时填充新列表?的主要内容,如果未能解决你的问题,请参考以下文章