在Python中,当添加到列表中时,为什么压缩的元素会被分离?
我想创建像A1、B2、C3和D4这样的名称在Python中,当添加到列表中时,为什么压缩的元素会被分离?,python,string,algorithm,list,iterator,Python,String,Algorithm,List,Iterator,我想创建像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 但是,如果我将列表批次\列表初始化为空,并将每个批次添加到其中,如下所示: batch_list = [] batches = zip('ABCD', range(1, 5)) for i in batches
batches = zip('ABCD', range(1, 5))
for i in batches:
batch = i[0] + str(i[1])
print(batch)
这将产生预期的输出:
A1
B2
C3
D4
但是,如果我将列表批次\列表初始化为空,并将每个批次添加到其中,如下所示:
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']
因为它将字符串视为数组
>>> arr = []
>>> arr += 'str'
>>> arr
['s', 't', 'r']
试试这个:
batch_list += [i[0] + str(i[1])]
或者这个:
batch_list.append(i[0] + str(i[1]))
问题是您需要扩展列表而不是附加到列表中。Python还考虑字符串序列:
>>> l = []
>>> l += 'ab'
>>> l
['a', 'b']
因此,+=
将扩展列表,将左侧iterable中的每个项目解包到右侧列表中。在幕后,+=
是列表的语法糖
>>> l = []
>>> l.__iadd__('abc')
['a', 'b', 'c']
list.\uuuu iadd\uuuuu
当传递一个iterable时,具有与list相同的行为。extended
:
>>> l = []
>>> l.extend('ab')
>>> l
['a', 'b']
要获得所需的行为,请使用list.append
:
batch_list.append(i[0] + str(i[1]))
通过使用+=
运算符,可以将字符串中的每个项目追加到批处理列表中。因此,避免破坏字符串的一种方法是将其包装在列表中
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.append
和list.extend
方法通常比使用+=
更好。虽然使用+=
的代码较短,但使用这些方法会使代码更具可读性,但也有其他好处,比如可以改变全局列表,尽管有些人可能会认为您不应该这样做。;)
但是有更好的方法来写这个
您可以使用列表理解,让.format
方法将字母与数字结合起来,这样就不需要显式调用str
构造函数
batch_list = ['{}{}'.format(*u) for u in zip('ABCD', range(1, 5))]
另一个选项是使用枚举
,而不是使用范围压缩。enumerate
函数允许您提供起始编号,而不是使用默认的起始编号零
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)]
您的扩展列表没有附加到它。如果您使用batch_list=[ch+str(n)for ch,n in zip('ABCD',range(1,5))]
虽然这产生了所需的结果,但它并没有回答第二种方法为什么不能按预期工作的问题。@mkrieger1,非常简单,因为答案已经给出了。我建议一个基于范围参数的替代解决方案。我从@Danil Speransky、Christian Dean和PM 2Ring那里得到的每一个答案都是值得的。除了提供的简洁正确的代码外,我还投票选择你的(PM 2Ring)作为提供丰富信息的正确答案。我不能将多个回答标记为正确答案,这真是令人伤心和羞耻。@SeshadriR您可以根据自己的意愿对多个答案进行投票。@mkrieger1是的,我这样做是为了表达我对他人的感谢。
>>> from itertools import count
>>> batch_list = []
>>> for i, v in zip('ABCD', count(1)): # count(1) -> start counter at 1
... batch = '{}{}'.format(i, v)
... batch_list.append(batch)
...
>>> batch_list
['A1', 'B2', 'C3', 'D4']