Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中,当添加到列表中时,为什么压缩的元素会被分离?_Python_String_Algorithm_List_Iterator - Fatal编程技术网

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

在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

我想创建像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:
  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']