অক্ষরের তালিকাকে স্ট্রিতে রূপান্তর করুন


উত্তর:


585

joinএর মধ্যে ফাঁকা স্ট্রিংয়ের সাথে সমস্ত স্ট্রিংগুলিতে একসাথে যোগদানের জন্য খালি স্ট্রিংয়ের পদ্ধতিটি ব্যবহার করুন :

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

1
আমি কীভাবে অক্ষরের মধ্যে ফাঁকা স্থান যুক্ত করতে পারি? যাইহোক পুরো জিনিসটির মাধ্যমে পুনরাবৃত্তি না করে এটি করতে?
clifgray

18
শুধু ' '.join(list)উদ্ধৃতিগুলির মধ্যে একটি স্থান দিয়ে করুন
ক্লিফগ্রি

এই সম্পর্কে একটি দুর্দান্ত বিষয় হ'ল আপনি '\ n'.join (ক) ব্যবহার করতে পারেন যদি আপনি প্রতিটি আইটেমের জন্য নতুন লাইন সহ একটি
টেক্সটটিতে

28
স্পষ্ট করা: "".join(['a','b','c'])মানে Join all elements of the array, separated by the string ""। একইভাবে, " hi ".join(["jim", "bob", "joe"])তৈরি করবে "jim hi bob hi joe"
জ্যাক

39

এটি জাভাস্ক্রিপ্ট এবং রুবির মতো অনেক জনপ্রিয় ভাষায় কাজ করে কেন পাইথনে নয়?

>>> ['a', 'b', 'c'].join('')
Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
AttributeError: 'list' object has no attribute 'join'

যথেষ্ট অদ্ভুত, পাইথনে joinপদ্ধতিটি strক্লাসে রয়েছে:

# this is the Python way
"".join(['a','b','c','d'])

জাভাস্ক্রিপ্ট বা অন্যান্য জনপ্রিয় স্ক্রিপ্ট ভাষার মতো কেন বস্তুটিতে joinকোনও পদ্ধতি নেই list? পাইথন সম্প্রদায় কীভাবে চিন্তা করে তার এটি একটি উদাহরণ। যেহেতু যোগদানটি একটি স্ট্রিং ফিরিয়ে দিচ্ছে, এটি স্ট্রিং ক্লাসে স্থাপন করা উচিত, তালিকা শ্রেণিতে নয়, সুতরাং str.join(list)পদ্ধতির অর্থ: তালিকার একটি নতুন স্ট্রিংয়ে strবিভাজক হিসাবে ব্যবহার করে (এই ক্ষেত্রে strএকটি খালি স্ট্রিং)।

কিছুক্ষন পরে আমি এই ভাবে ভাবতে ভালোবাসি। পাইথন ডিজাইনে আমি প্রচুর জিনিস সম্পর্কে অভিযোগ করতে পারি, তবে এটির সংগতি সম্পর্কে নয়।


1
তালিকা পদ্ধতির পরিবর্তে স্ট্রিং পদ্ধতিতে যোগদানের মূল কারণটি হ'ল এটি কোনও তালিকা নয়, কোনও পুনরাবৃত্তিকে গ্রহণ করে । আপনি জেনারেটর এক্সপ্রেশন, অভিধান, সেট, বিভিন্ন ধরণের ভিউ এবং আরও কিছু ব্যবহার করতে পারেন। সুতরাং এটি বেশিরভাগ ভাষায় অ্যারে যোগদানের অপারেশন থেকে অনেক বেশি নমনীয়।
রসুয়াভ

আমি পাইথনের তুলনা করছিলাম string.join()বেশিরভাগ সংগ্রহের সাথে join()অনেকগুলি গতিশীল ভাষায় একটি পদ্ধতি রয়েছে। পুনরাবৃত্তিযোগ্যদের সম্পর্কে, আমি অনুমান করি যে এই জাতীয় ভাষার ক্ষেত্রে এটি কোনও সমস্যা নয় কারণ join()পদ্ধতিতে সংগ্রহের নির্মাতা এবং শৃঙ্খলে পুনরাবৃত্তকারীগুলিকে সংযুক্ত করা যতটা সহজ (এবং প্রগা )়) is
পাওলো স্কার্ডাইন

হ্যাঁ, ধরে নিচ্ছি তাদের কাছে হয় অলস তালিকাগুলি রয়েছে (হাস্কেল স্টাইল) অথবা আপনি শুরু করার আগে মেমরিতে তালিকাটি কোলেস করে আরামদায়ক। আমার বক্তব্যটি হ'ল পাইথনের কাজ করার পদ্ধতিটি স্বেচ্ছাচারিতা নয়, এটির খুব ভাল ন্যায়সঙ্গততা রয়েছে।
রসুয়াভ

1
এটি স্বেচ্ছাচারী নয়, প্রতিটি শ্রেণিতে নাম স্থান দূষণ এড়াতে এটি একটি ডিজাইনের সিদ্ধান্ত। :-)
পাওলো স্কার্ডাইন

যথাযথভাবে। প্লাস, এগুলির সমস্ত এমনকি ক্লাস নয় - "পুনরাবৃত্ত" একটি প্রোটোকল, কোনও শ্রেণি নয়। আপনি যেকোন পুনরাবৃত্তযোগ্য ব্যবহার করে ফিল্টার, মানচিত্র, যোগদান ইত্যাদি করতে পারেন।
রসুয়াভ

15

যদি আপনার পাইথন ইন্টারপ্রেটারটি পুরানো হয় (উদাহরণস্বরূপ, যা কিছু পুরানো লিনাক্স বিতরণে প্রচলিত) তবে আপনার join()কোনও পুরানো স্ট্রিং অবজেক্টে পদ্ধতি হিসাবে উপলব্ধ নাও হতে পারে এবং তার পরিবর্তে আপনার স্ট্রিং মডিউলটি ব্যবহার করতে হবে। উদাহরণ:

a = ['a', 'b', 'c', 'd']

try:
    b = ''.join(a)

except AttributeError:
    import string
    b = string.join(a, '')

স্ট্রিং bহবে 'abcd'


10

এটি সবচেয়ে দ্রুততম উপায় হতে পারে:

>> from array import array
>> a = ['a','b','c','d']
>> array('B', map(ord,a)).tostring()
'abcd'

4
@ উইনস্টনওয়ার্ট হ্যাঁ, গতকাল আমি এমন একটি প্রোগ্রাম লিখছিলাম যা এই জাতীয় কাজ করা দরকার এবং আমি আমার প্রোগ্রামে এই লাইনটি গণনার জন্য কয়েকটি উপায় বেঞ্চমার্ক করেছি, ফলাফলটি দেখায় এটি প্রায় 20% দ্রুত''.join(['a','b','c'])
বিগাগল

2
আমার নিজস্ব বেনমার্ক শোগুলি 7 গুণ দ্রুত হতে যোগ দেয়। পেস্টবিন . com/8 এনএসসি 5এক 1 । আপনি আপনার বেঞ্চমার্ক ভাগ করে নিতে আপত্তি?
উইনস্টন ইওয়ার্ট

1
@ উইনস্টনওয়ার্ট আপনি ঠিক বলেছেন আমি এর কারণটি খুঁজে পেয়েছি: আমার প্রোগ্রামে আমি নেটওয়ার্ক থেকে ইনটেলের একটি তালিকা পুনরায় সংগ্রহ করেছি তারপরে স্ট্রিংয়ে রূপান্তর করব যেখানে map(ord,a)অপ্রয়োজনীয়, তবে প্রয়োজনে যোগ দিন map(chr,a)। এখানে আমার
বেনমার্কের

15
অকাল অপ্টিমাইজেশন। এটি পড়তে এবং বুঝতে পারছে যে কি চলছে so ব্যবহারকারী অপারেশনটিতে পারফরম্যান্সের প্রয়োজন না থাকলে একটি সাধারণ ''.join()আরও অনেক বেশি পাঠযোগ্য।
লুইজ দামিম

5
অসম্মতি - প্রোগ্রামারদের এই জাতীয় কাজের জন্য দ্রুততম পদ্ধতিগুলি মনে রাখা দরকার। একটি সহজ সরল অপারেশন যা একটু বেশি সময় নেয় এটি কোনও বড় বিষয় নয়। যাইহোক, ঠিক এভাবেই প্রতিটি লিখিত প্রোগ্রাম ফুলে ফেঁপে ও খুব বেশি সংস্থান গ্রহণ করে। যখন আমরা নিজেকে যতটা সম্ভব পাতলা করে দেওয়ার অভ্যাসে রাখি না, তখন আমরা এমন এক পৃথিবীর সমাপ্তি করি .... ঠিক আছে, উইন্ডোজ ভিস্তার মতো, বা লিনাক্সের আপস্টার্ট অনেকগুলি ছোট শর্টকাটের উত্তম উদাহরণ যা 'ফোলা এবং ভাসা', জলে মৃত হিসাবে। তারা উভয় খুব কুরুচিপূর্ণ। কেন ব্যবহার করবেন না ()। যোগদান (ক) যা 100% অভিব্যক্তিপূর্ণ imfho ..
ওসিরিসগোথর

4

হ্রাস ফাংশনও কাজ করে

import operator
h=['a','b','c','d']
reduce(operator.add, h)
'abcd'

1
এটি সর্বদা আমাকে জাগিয়ে তোলে যে অপারেটররা তাদের নিজস্ব অধিকার হিসাবে প্রথম শ্রেণির নাগরিক নয়। প্রকল্পে, উদাহরণস্বরূপ, এটি হবে (হ্রাস + ঘ)
ব্রায়ান মিন্টন

স্কিম, (reduce + '' h)বা (apply + h)কাজ করবে। তবে আবার, পাইথনে, অ্যাড অপারেটর ঠিক 2 টি অপারেন্ড নেয়, তাই হ্রাস করার প্রয়োজন। অন্যথায়, আপনি এটি করতে পারেন operator.add(*h), যেহেতু applyবর্ধিত কল সিনট্যাক্সের পক্ষে পাইথনে আনুষ্ঠানিকভাবে অবহিত করা হয়েছে (ওরফে en.wikedia.org/wiki/Variadic_function )
ব্রায়ান মিনটন

3

তালিকা সংখ্যার থাকে, আপনি ব্যবহার করতে পারেন map()সঙ্গে join()

উদাহরণ:

>>> arr = [3, 30, 34, 5, 9]
>>> ''.join(map(str, arr))
3303459

এটি ব্যবহার করার জন্য এটি আসলে আরও ''.join([str(i) for i in arr])
অজগর

@ ব্যবহারকারী 1767754 ওয়েল, গিডো সেই স্টাইলটি পছন্দ করে তবে মানচিত্রের কার্যকারিতাটি ব্যবহার করার ক্ষেত্রে কোনও ভুল নেই।
ব্রুস

2
h = ['a','b','c','d','e','f']
g = ''
for f in h:
    g = g + f

>>> g
'abcdef'

6
এটি বেশ ধীর হবে। ব্যবহার করা ''.join(h)আপনার এক-এক-এক সংযোজন পদ্ধতিটিকে ছাড়িয়ে যাবে।
মার্টিজন পিটারস

1
পাইথন বাইবেলে (যে 1400+ পৃষ্ঠা এক), অনেক জায়গায় এটি আমাদেরকে বলে যে এটি করা ভুল এবং যখনই সম্ভব সম্ভব এড়ানো উচিত। এটি অজ্ঞাত অজগর প্রাথমিকের একটি বেদনাদায়ক স্পষ্ট ট্রেডমার্কও রয়েছে (কার্যকারিতাটি অপমান করার জন্য নয় ... ভাল) এটি কাজ করতে পারে তবে এটি করার জন্য আপনি প্রায় 5000 জনের কাছ থেকে "এটি করবেন না" শুনবেন।
ওসিরিসগোথর

2

str.joinসবচেয়ে প্রাকৃতিক উপায় ছাড়াও , সম্ভাবনা হ'ল io.StringIOএকসাথে writelinesসমস্ত উপাদান লিখতে এবং অপব্যবহার করা:

import io

a = ['a','b','c','d']

out = io.StringIO()
out.writelines(a)
print(out.getvalue())

কপি করে প্রিন্ট:

abcd

একটি জেনারেটর ফাংশন বা পুনরাবৃত্ত যা একটি tupleবা একটি নয় এর সাথে এই পদ্ধতির ব্যবহার করার সময় list, এটি অস্থায়ী তালিকা তৈরির সংরক্ষণ করেjoin সঠিক আকার বরাদ্দ করতে পারে (এবং 1-অক্ষরের স্ট্রিংগুলির তালিকা খুব ব্যয়বহুল স্মৃতি অনুসারে )।

যদি আপনার স্মৃতিশক্তি কম থাকে এবং আপনার কাছে ইনপুট হিসাবে অলস-মূল্যায়িত বস্তু থাকে তবে এই পদ্ধতির সেরা সমাধান solution


0

আপনি এটির মতোও ব্যবহার করতে operator.concat()পারেন:

>>> from operator import concat
>>> a = ['a', 'b', 'c', 'd']
>>> reduce(concat, a)
'abcd'

আপনি যদি পাইথন 3 ব্যবহার করেন তবে আপনাকে পুনরায় ত্যাগ করতে হবে:

>>> from functools import reduce

যেহেতু বিল্টিনটি reduce()পাইথন 3 থেকে সরানো হয়েছে এবং এখন এটি বাস করে functools.reduce()

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