পাইথন স্ট্রিং.জাইন (তালিকা) স্ট্রিং অ্যারের পরিবর্তে অবজেক্ট অ্যারেতে


290

পাইথনে, আমি এটি করতে পারি:

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

আমার কাছে অবজেক্টের একটি তালিকা থাকলে একই কাজ করার কোনও সহজ উপায় আছে?

>>> class Obj:
...     def __str__(self):
...         return 'name'
...
>>> list = [Obj(), Obj(), Obj()]
>>> ', '.join(list)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: sequence item 0: expected string, instance found

বা লুপের জন্য আমাকে কি অবলম্বন করতে হবে?

উত্তর:


430

পরিবর্তে আপনি একটি তালিকা বোধগম্যতা বা একটি জেনারেটর এক্সপ্রেশন ব্যবহার করতে পারেন:

', '.join([str(x) for x in list])  # list comprehension
', '.join(str(x) for x in list)    # generator expression

3
বা একটি জেনারেটর এক্সপ্রেশন: ',' .জাইন (তালিকায় x এর জন্য (এক্স))
ডিএফ।

1
কোন ধারণা তাদের উপর দ্রুত হবে?
গোজিলি

আমার পরীক্ষাগুলি বলছে যে তালিকাটি বোঝাপড়াটি ছোট তালিকায় একটি ভাল 60% দ্রুত হতে পারে (তিনটি বস্তুর () গুলি) এর তালিকায় পরীক্ষামূলকভাবে 10 ^ 6 বার চালান। তবে তাদের পারফরম্যান্স বড় তালিকায় একই রকম (10 ^ 7 অবজেক্ট () তালিকায় একবার দ্বিতীয় পরীক্ষা চালানো)।
গোজিলি

3
ভাল 30% স্পিড-আপের জন্য (উপরে জেনারেটরের এক্সপ্রেশনের ওপরে), কেউ অনুমানযোগ্য কম পঠনযোগ্য mapএক্সপ্রেশন (নীচে) ব্যবহার করতে পারেন ।
কে 3 --- আরএনসি

2
এই উত্তরটি mapসমাধানের চেয়ে উদ্দেশ্যমূলকভাবে খারাপ ।
পাসক্যালভিকুটেন

95

অন্তর্নির্মিত স্ট্রিং নির্মাণকারী স্বয়ংক্রিয়ভাবে কল করবে obj.__str__:

''.join(map(str,list))

1
মানচিত্র () তালিকাটি পরিবর্তন করে না, এটি [তালিকার জন্য
ওআর

11
+1: মানচিত্রটি একটি ভাল পদ্ধতির; "তালিকা পরিবর্তন করা" একটি সঠিক মন্তব্য নয়।
এস .লট

2
(অন্য) +1 .. মানচিত্রটি কম পাঠযোগ্য নয়, কেবল মানচিত্রের ফাংশনটি কী করে তা জানতে হবে
ল্যাপাক্স

1
@ মিশেল সঠিক নয় reduceএটিই মুছে ফেলা হয়েছিল, কারণ এটি সাধারণত অনুমান করা ছেড়ে দেয় এবং এভাবে "পাইথোনিক" ছিল না। mapঅন্যদিকে একটি সমস্যা নয়।
পাস্কালভিকিউটেন

1
(অন্য) +1: পার্ল বিশ্ব থেকে আসা এটি মহাবিশ্বের সবচেয়ে সাধারণ বিষয়: যোগ দিন ("সেপ", তালিকা) - এবং তালিকার সমস্ত উপাদান তাদের স্ট্রিং উপস্থাপনায় রূপান্তরিত হয়। অজগরের সমাধান খুঁজতে আমি সত্যিই লড়াই করে যাচ্ছি।
জেসন

2

আর একটি সমাধান টিআর ক্লাসের জোড় অপারেটরকে ওভাররাইড করা।

নীচে একটি নতুন ক্লাস my_string সংজ্ঞায়িত করা যাক

class my_string(str):
    def join(self, l):
        l_tmp = [str(x) for x in l]
        return super(my_string, self).join(l_tmp)

তাহলে আপনি করতে পারেন

class Obj:
    def __str__(self):
        return 'name'

list = [Obj(), Obj(), Obj()]
comma = my_string(',')

print comma.join(list)

এবং আপনি পেতে

name,name,name

বিটিডাব্লু, তালিকাটি ভেরিয়েবল নাম হিসাবে ব্যবহার করে আপনি তালিকার শ্রেণি (কীওয়ার্ড) পুনরায় সংজ্ঞায়িত করছেন! সাধারণত অন্য সনাক্তকারী নাম ব্যবহার করুন।

আশা করি আপনি আমার উত্তরটি কাজে লাগবেন।


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.