在Python中,当添加到列表中时,为什么zipped元素会被分离?

2024-05-12 22:38:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我想创建像A1,B2,C3和D4这样的名字

batches = zip('ABCD', range(1, 5))

for i in batches:
  batch = i[0] + str(i[1])
  print(batch)

这将产生预期的输出:

A1
B2
C3
D4

但是,如果我将一个list batch\u list初始化为空并将每个批添加到其中,如下所示:

batch_list = []

batches = zip('ABCD', range(1, 5))

for i in batches:
  batch_list += i[0] + str(i[1])

print(batch_list)

输出如下:

['A', '1', 'B', '2', 'C', '3', 'D', '4']

为什么不呢?你知道吗

['A1', 'B2', 'C3', 'D4']

Tags: infora1batchrangebatcheszip名字
3条回答

因为它将字符串视为数组。你知道吗

>>> arr = []
>>> arr += 'str'
>>> arr
['s', 't', 'r']

试试这个:

batch_list += [i[0] + str(i[1])]

或者这个:

batch_list.append(i[0] + str(i[1]))

通过使用+=运算符,可以将字符串中的每个项附加到batch_list。因此,避免断开字符串的一种方法是将其包装在一个列表中。你知道吗

batch_list = []
for i in zip('ABCD', range(1,5)):
    batch_list += [i[0] + str(i[1])]
print(batch_list)

输出

['A1', 'B2', 'C3', 'D4'] 

顺便说一句,使用list.appendlist.extend方法通常比使用+=更好。虽然使用+=的代码较短,但使用这些方法会使代码更具可读性,但也有其他好处,比如可以改变全局列表,尽管有些人可能会认为无论如何都不应该这样做。;)


但是有更好的方法来写这个。你知道吗

您可以使用列表理解,让.format方法将字母和数字结合起来,这样就不需要显式调用str构造函数。你知道吗

batch_list = ['{}{}'.format(*u) for u in zip('ABCD', range(1, 5))]

另一种选择是使用enumerate,而不是使用range压缩。enumerate函数允许您提供起始数字,而不是使用默认的起始数字0。你知道吗

batch_list = ['{}{}'.format(v, i) for i, v in enumerate('ABCD', 1)]

这可能是最有效的方法,除非您有Python 3.6,在这种情况下,您可以使用f字符串来进行格式化:

batch_list = [f'{v}{i}' for i, v in enumerate('ABCD', 1)]

问题是你需要扩展列表而不是附加到列表中。Python也考虑字符串序列:

>>> l = []
>>> l += 'ab'
>>> l
['a', 'b']

因此,+=将通过将左侧iterable中的每个项解压到右侧列表来扩展列表。在幕后,+=list.__iadd__的语法糖:

>>> l = []
>>> l.__iadd__('abc')
['a', 'b', 'c']

list.__iadd__传递iterable时,具有与list.extended相同的行为:

>>> l = []
>>> l.extend('ab')
>>> l
['a', 'b']

要获得所需的行为,请改用list.append

batch_list.append(i[0] + str(i[1]))

相关问题 更多 >