ChatGPT解决这个技术问题 Extra ChatGPT

你将如何从字符串列表中创建一个逗号分隔的字符串?

从序列中连接字符串的首选方法是什么,以便在每两个连续对之间添加一个逗号。也就是说,例如,如何将 ['a', 'b', 'c'] 映射到 'a,b,c'? (案例 ['s'][] 应分别映射到 's'''。)

我通常最终会使用 ''.join(map(lambda x: x+',',l))[:-1] 之类的东西,但也感到有些不满意。

这回答了你的问题了吗? How to concatenate items in a list to a single string?

N
Nicolas Gervais
my_list = ['a', 'b', 'c', 'd']
my_string = ','.join(my_list)
'a,b,c,d'

如果列表包含整数,这将不起作用

如果列表包含非字符串类型(例如整数、浮点数、布尔值、无),则执行以下操作:

my_string = ','.join(map(str, my_list)) 

请注意,如果您使用的是 python 2.7(您现在不应该使用它),那么如果列表中的任何项目具有 unicode,则使用 str 将引发异常。
我的要求是填写 SQL“WHERE x NOT IN ()”子句。 join() 函数将在元素之间插入您喜欢的任何字符串,但对列表的每一端都不做任何事情。所以这有效: nameString = '"{}"'.format('", "'.join(nameList)) 这些是包含所需双引号字符串的单引号。蟒蛇 3.7
为什么python没有专业的功能来执行这个操作?
值得注意的是,这个答案是在 13 年前发布的。我猜从那时起,Python 发生了很多变化。
G
Georgy

为什么要使用 map/lambda 魔法?这不行吗?

>>> foo = ['a', 'b', 'c']
>>> print(','.join(foo))
a,b,c
>>> print(','.join([]))

>>> print(','.join(['a']))
a

如果列表中有数字,您可以使用列表推导:

>>> ','.join([str(x) for x in foo])

或生成器表达式:

>>> ','.join(str(x) for x in foo)

R
Ricky Sahu

",".join(l) 不适用于所有情况。我建议将 csv 模块与 StringIO 一起使用

import StringIO
import csv

l = ['list','of','["""crazy"quotes"and\'',123,'other things']

line = StringIO.StringIO()
writer = csv.writer(line)
writer.writerow(l)
csvcontent = line.getvalue()
# 'list,of,"[""""""crazy""quotes""and\'",123,other things\r\n'

Python 3 中没有 StringIO
@RonKalian 在 Python 3 中使用 from io import StringIO
A
Aaron Maenpaa

@彼得霍夫曼

使用生成器表达式的好处是还可以生成迭代器,但可以节省导入 itertools。此外,列表推导通常优于映射,因此,我希望生成器表达式优于 imap。

>>> l = [1, "foo", 4 ,"bar"]
>>> ",".join(str(bit) for bit in l)
'1,foo,4,bar' 

请专家告诉为什么这不是最好的解决方案?它适用于整数、字符串(也适用于“疯狂字符”),而且它只是 1 行代码。我是新手,所以我想知道这种方法的局限性。
j
jfs

这是 Python 3.0 中允许非字符串列表项的替代解决方案:

>>> alist = ['a', 1, (2, 'b')]

一种标准方式 >>> ", ".join(map(str, alist)) "a, 1, (2, 'b')"

替代解决方案 >>> import io >>> s = io.StringIO() >>> print(*alist, file=s, sep=', ', end='') >>> s.getvalue() " a, 1, (2, 'b')"

注意:逗号后面的空格是故意的。


t
twasbrillig

你不只是想要:

",".join(l)

显然,如果您需要在值中引用/转义逗号等,它会变得更加复杂。在这种情况下,我建议查看标准库中的 csv 模块:

https://docs.python.org/library/csv.html


S
Shameem
>>> my_list = ['A', '', '', 'D', 'E',]
>>> ",".join([str(i) for i in my_list if i])
'A,D,E'

my_list 可以包含任何类型的变量。这避免了结果 'A,,,D,E'


A
AlvaroAV
l=['a', 1, 'b', 2]

print str(l)[1:-1]

Output: "'a', 1, 'b', 2"

我认为您应该指出,与此页面上的其他解决方案不同,您也引用了字符串。
P
Peter Hoffmann

@jmanning2k 使用列表推导具有创建新临时列表的缺点。更好的解决方案是使用返回迭代器的 itertools.imap

from itertools import imap
l = [1, "foo", 4 ,"bar"]
",".join(imap(str, l))

此解决方案不满足不为空字符串添加额外逗号以及使用 NoneType 添加“None”的要求。
与生成器相比,check str.joinlist 一起工作得更快
佚名

这是一个带有列表的示例

>>> myList = [['Apple'],['Orange']]
>>> myList = ','.join(map(str, [i[0] for i in myList])) 
>>> print "Output:", myList
Output: Apple,Orange

更准确的:-

>>> myList = [['Apple'],['Orange']]
>>> myList = ','.join(map(str, [type(i) == list and i[0] for i in myList])) 
>>> print "Output:", myList
Output: Apple,Orange

示例 2:-

myList = ['Apple','Orange']
myList = ','.join(map(str, myList)) 
print "Output:", myList
Output: Apple,Orange

这个问题是关于列表的,而不是关于列表的。
@EeroAaltonen 我更新了我的答案,感谢您指出我的正确方向。
f
faiz-e

如果你想做捷径:):

','.join([str(word) for word in wordList])

但是,如果您想用逻辑炫耀:):

wordList = ['USD', 'EUR', 'JPY', 'NZD', 'CHF', 'CAD']
stringText = ''

for word in wordList:
    stringText += word + ','

stringText = stringText[:-2]   # get rid of last comma
print(stringText)

D
David Singer

除非我遗漏了什么,否则 ','.join(foo) 应该按照您的要求去做。

>>> ','.join([''])
''
>>> ','.join(['s'])
's'
>>> ','.join(['a','b','c'])
'a,b,c'

(编辑:正如 jmanning2k 指出的那样,

','.join([str(x) for x in foo])

更安全且非常 Pythonic,尽管如果元素可以包含逗号,则生成的字符串将难以解析——此时,您需要 csv 模块的全部功能,正如 Douglas 在他的回答中指出的那样。)


R
Ron Kalian

我想说 csv 库是这里唯一明智的选择,因为它是为应对所有 csv 用例而构建的,例如字符串中的逗号等。

要将列表 l 输出到 .csv 文件:

import csv
with open('some.csv', 'w', newline='') as f:
    writer = csv.writer(f)
    writer.writerow(l)  # this will output l as a single row.  

也可以使用 writer.writerows(iterable) 将多行输出到 csv。

此示例与 Python 3 兼容,因为此处的另一个答案使用了 Python 2 的 StringIO


但与其他答案相比,这不是太多/复杂吗?
C
Cristián Vargas Acevedo

mmm 还需要 SQL 是:

l = ["foo" , "baar" , 6]
where_clause = "..... IN ("+(','.join([ f"'{x}'" for x in l]))+")"
>> "..... IN ('foo','baar','6')"

享受


R
Roberto

我的两分钱。我喜欢更简单的python中的一行代码:

>>> from itertools import imap, ifilter
>>> l = ['a', '', 'b', 1, None]
>>> ','.join(imap(str, ifilter(lambda x: x, l)))
a,b,1
>>> m = ['a', '', None]
>>> ','.join(imap(str, ifilter(lambda x: x, m)))
'a'

它是 Pythonic,适用于字符串、数字、None 和空字符串。它很短,满足要求。如果列表不包含数字,我们可以使用这个更简单的变体:

>>> ','.join(ifilter(lambda x: x, l))

此外,此解决方案不会创建新列表,而是使用迭代器,例如 @Peter Hoffmann 指出的(谢谢)。


这是多余的。公认的答案是简单、直接且显然是最佳解决方案。提供过于复杂的替代方案是对时间的毫无意义的浪费。如果您只是在已经有可行答案的情况下尝试了解该语言的其他功能,那么您正在做的事情与您对我的反对意见相同。