كيف يمكنك إنشاء سلسلة مفصولة بفواصل من قائمة السلاسل؟

StackOverflow https://stackoverflow.com/questions/44778

  •  09-06-2019
  •  | 
  •  

سؤال

ما هي الطريقة المفضلة لديك لتسلسل السلاسل من تسلسل بحيث تتم إضافة فاصلة بين كل زوجين متتاليين.بمعنى، كيف يمكنك رسم خريطة، على سبيل المثال، [ 'a', 'b', 'c' ] ل 'a,b,c'؟(الحالات [ s ] و [] ينبغي تعيينها ل s و '', ، على التوالى.)

عادةً ما ينتهي بي الأمر باستخدام شيء مثل ''.join(map(lambda x: x+',',l))[:-1], ، ولكن أيضًا أشعر بعدم الرضا إلى حد ما.

يحرر:أشعر بالخجل والسعادة لأن الحل بسيط للغاية.من الواضح أنه ليس لدي أدنى فكرة عما أفعله.(ربما كنت بحاجة إلى تسلسل "بسيط" في الماضي وحفظته بطريقة ما s.join([e1,e2,...]) كاختصار ل s+e1+e2+....)

هل كانت مفيدة؟

المحلول

myList = ['a','b','c','d']
myString = ",".join(myList )

لن ينجح هذا إذا كانت القائمة تحتوي على أرقام.


مثل ريكاردو رييس مقترح، إذا كان يحتوي على أنواع غير سلسلة (مثل الأعداد الصحيحة، والعوامات، والمنطقيات، ولا شيء) فافعل ما يلي:

myList = ','.join(map(str, myList)) 

نصائح أخرى

لماذا الخريطة/سحر لامدا؟لا يعمل هذا؟

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

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

يحرر:يشير @mark-biek إلى حالة الأرقام.ولعل فهم القائمة:

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

هو أكثر "بيثونية".

تحرير 2:شكرا على الاقتراحات.سأستخدم المولد بدلاً من فهم القائمة في المستقبل.

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

",".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.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')"
    

ملحوظة:المسافة بعد الفاصلة مقصودة.

@ بيتر هوفمان

إن استخدام تعبيرات المولد له فائدة أيضًا في إنتاج مكرر ولكنه يوفر استيراد أدوات itertools.علاوة على ذلك، يُفضل بشكل عام تعيين فهم القائمة، وبالتالي أتوقع تفضيل تعبيرات المولد على imap.

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

لا تريد فقط:

",".join(l)

من الواضح أن الأمر يصبح أكثر تعقيدًا إذا كنت بحاجة إلى اقتباس/إلغاء الفواصل وما إلى ذلك في القيم.في هذه الحالة أود أن أقترح النظر إلى وحدة CSV في المكتبة القياسية:

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

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

my_list قد تحتوي على أي نوع من المتغيرات.هذا تجنب النتيجة 'A,,,D,E'.

@ jmanning2k استخدام فهم القائمة له الجانب السلبي المتمثل في إنشاء قائمة مؤقتة جديدة.الحل الأفضل هو استخدام itertools.imap الذي يقوم بإرجاع مكرر

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

لتحويل القائمة التي تحتوي على أرقام قم بما يلي:

string  =  ''.join([str(i) for i in list])
l=['a', 1, 'b', 2]

print str(l)[1:-1]

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

إلا إذا كنت في عداد المفقودين شيء، ','.join(foo) يجب أن تفعل ما تطلبه.

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

(يحرر:وكما يشير jmanning2k،

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

أكثر أمانًا وبيثونية تمامًا، على الرغم من أنه سيكون من الصعب تحليل السلسلة الناتجة إذا كانت العناصر يمكن أن تحتوي على فواصل - عند هذه النقطة، تحتاج إلى القوة الكاملة لل csv الوحدة النمطية، كما يشير دوغلاس في إجابته.)

هنا مثال مع القائمة

>>> 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

أود أن أقول 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، كما استخدمت الإجابة الأخرى هنا StringIO وهو بيثون 2.

قليلا فقط شيء من هذا القبيل :)

String = "Once:Upon:a:Time:A:Long:Time:Ago"
ding = String.split(':')

ring = (" , ").join(ding)

print(ring)

انتاج:ذات مرة، منذ زمن طويل

سنتى.أحب رمزًا من سطر واحد أبسط في بيثون:

>>> 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'

إنها لغة بايثونية، وتعمل مع السلاسل والأرقام ولا شيء والسلسلة الفارغة.إنها قصيرة وتلبي المتطلبات.إذا كانت القائمة لن تحتوي على أرقام، فيمكننا استخدام هذا الاختلاف الأبسط:

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

كما أن هذا الحل لا ينشئ قائمة جديدة، ولكنه يستخدم مكررًا، مثل @Peter Hoffmann الذي أشار (شكرًا).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top