কীভাবে% s কে {0}, {1}… কম আটকানোতে পরিণত করবেন?


11

পরবর্তী প্রতিস্থাপনের জন্য আমাকে স্থানধারকযুক্ত একটি স্ট্রিং নিতে হবে, যেমন:

"A %s B %s"

এবং এটিতে পরিণত করুন:

"A {0} B {1}"

আমি সাথে এসেছি:

def _fix_substitution_parms(raw_message):
  rv = raw_message
  counter = 0
  while '%s' in rv:
    rv = rv.replace('%s', '{' + str(counter) + '}', 1)
    counter = counter + 1
return rv

এটি কাজ করে, তবে এটি সুপার ক্লানকি অনুভব করে এবং "আইডোমেটিক" অজগরটি মোটেই না।

একটি ভাল, idiomatic অজগর সমাধান দেখতে কেমন হবে?

স্পষ্টতার জন্য আপডেটগুলি:

  • ফলেযুক্ত স্ট্রিংগুলি পাইথনের মধ্যে ব্যবহার করা হয় না। আমি কি করতে সেখানে পাল্টা নম্বর প্রয়োজন! (তাই {}যথেষ্ট ভাল না)!
  • আমার কেবল %sস্ট্রিংগুলির যত্ন নেওয়া দরকার , কারণ কেবলমাত্র বার্তাগুলি কেবল ব্যবহারের গ্যারান্টিযুক্ত %s(যা %i %fকিছু নেই)

সংখ্যাযুক্ত ধনুর্বন্ধনী সহ গতিময় প্রতিস্থাপনের জন্য "রি.সুব" একটি ফাংশন নিতে পারে। উপায় দ্বারা: সংখ্যা ছাড়াই {। প্রতিস্থাপন করাও কাজ করবে।
মাইকেল বুশচার

3
যখন আপনার একটি কার্যনির্বাহী সমাধান রয়েছে এবং আপনি এটি উন্নতি করতে চান, দয়া করে
কোডেরভিউ

@ কোজিরো "খুব
আড়াল

উত্তর:


5

রেজনিক মূলত যা পরামর্শ করেছিল আমি তা করব এবং তারপরে কল করব .format:

def _fix_substitution_parms(raw_message: str) -> str:
    num_to_replace = raw_message.count("%s")
    python_format_string_message = raw_message.replace("%s", "{{{}}}")
    final_message = python_format_string_message.format(*range(num_to_replace))
    return final_message

লেখায় 2 টি থাকলেই এটি কাজ করবে %s?
চারিফ ডিজেড

@ চারিফডিজেড এবং অরণ-ফে - সম্পাদনা দেখুন। আপনি কেবল তাদের হাতের আগে গণনা করুন ...
ড্যান

দেখে মনে হচ্ছে একটি ভাল আপস ... পাঠযোগ্য, তবে খুব অভিনব নয়।
ঘোস্টগেট মনিকা সিকে

8

ব্যবহার করুন re.subপ্রতিকল্পন প্রতিটি উপাদান জন্য একবার এবং reapplying জন্য একটি ল্যামডা ফাংশন itertools.countসংখ্যার ক্রমানুসারে পাবার জন্য:

import itertools
import re

s = "A %s B %s"

counter = itertools.count()
result = re.sub('%s', lambda x: f'{{{next(counter)}}}', s)
print(result)  # 'A {0} B {1}'

এই অপারেশন একাধিকবার সম্পাদন করার জন্য একটা ফাংশনে এই মোড়ানো, যেহেতু আপনি রিফ্রেশ করতে হবে মনে রেখো itertools.count


ভাল
লাগছে

@ ঘোস্টগেট এটি অস্পষ্ট নয়, কাউন্টারটি জেনারেটর হয় যখনই আপনি next(counter)এটিকে পরবর্তী মান উত্পাদন করার কথা বলেন, আমি সবসময় এই জেনারেটরটি সম্পর্কে খুব সুন্দর উত্তরটি ভুলে যাই
চারিফ ডিজেড

@ ঘোস্টগেটস রেজেেক্স এবং একই লাইনে ক্রিয়ামূলক প্রোগ্রামিং: -পিআই অনুমান করে যে এই সরঞ্জামগুলিতে আপনি কতটা ব্যবহার করছেন তার উপর "অস্পষ্টতা" নির্ভর করে।
jfaccioni

3

আমি মনে করি এই শব্দটি কাজ করে

rv.replace('%s','{{{}}}').format(*range(rv.count('%s')))


1
@ ঘোস্টগেট ওয়ান-লাইনার দ্বারা প্রলোভিত হবেন না, মনে রাখবেন লোকেরা কোড বজায় রাখতে হবে
ড্যান

1
@ ড্যান আমি জানি তবে আমি কম কোড বজায় রাখার জন্যও কম কোড।
ঘোস্টগেট মনিকা সি কে সালাম জানায়

এটি যদিও কম নয়, এটি ডিবাগ করা কেবল আরও শক্ত এবং পড়ার জন্য কোনও ভবিষ্যতের দেবের কাছে আরও শক্ত। এই উত্তরটি আমার সাথে সাদৃশ্যপূর্ণ হওয়ার খুব কাছাকাছি, এতে একই ফাংশন কল রয়েছে (বিভাজনের পরিবর্তে বদলে যাওয়া এবং যোগদান) তবে যদি কোনও মধ্যবর্তী পদক্ষেপে সমস্যা হয় তবে কী হবে? কিভাবে আপনি এটি বিচ্ছিন্ন হবে। এবং যা নতুন কোডটি কোড থেকে এটি কী করে তা বুঝতে দ্রুততর। আমি সত্যিই আপনাকে সুপারিশ করছি আপনি একটি যুক্ত লাইনে এত যুক্তি স্থাপন করবেন না।
ড্যান

1
খুব সুন্দর ওয়ানলাইনার নয়। X.join(Y.split(Z))এটি কেবল লেখার একটি বিভ্রান্তিমূলক উপায় Y.replace(X, Z)এবং এর rangeমধ্যে কোনওর মধ্যে কলটি लपेटানোর দরকার নেই list(...)
অরণ-ফেই

1
@ ড্যান হ্যাঁ, সে সম্পর্কে দুঃখিত, (এখন কেবলমাত্র এক লাইনে) :)
রেজজনিক

1

re.subগতিশীল প্রতিস্থাপনের জন্য ব্যবহার :

import re

text = "A %s B %s %s B %s"


def _fix_substitution_parms(raw_message):
    counter = 0
    def replace(_):
        nonlocal counter
        counter += 1
        return '{{{}}}'.format(counter - 1)
    return re.sub('%s', replace, raw_message)


print(_fix_substitution_parms(text))  # A {0} B {1} {2} B {3}

1
মনে রাখবেন যে এটি পালিয়ে যাওয়া স্থানধারীদের জন্য অ্যাকাউন্ট নয় ( %%s) - যদি এটি উদ্বেগজনক হয় তবে আপনি তার r'(?<!%)%s'পরিবর্তে রেজেক্স ব্যবহার করতে পারেন ।
অরণ-ফে

আপনি যদি মূ {{{}}}? ় প্রশ্নটি মঞ্জুর করেন: আসলে আসলে কী ?
ঘোস্টটাগি মনিকা সি কে

স্ট্রিং ফরমেটিং পালাতে {আমরা আমাদের \{মতো স্বাভাবিকের মতো করি না {{
চারিফ ডিজেড

1

একটি জেনারেটর ব্যবহার:

def split_and_insert(mystring):
    parts = iter(mystring.split('%s'))
    yield next(parts)
    for n, part in enumerate(parts):
        yield f'{{{n}}}'
        yield part

new_string = ''.join(split_and_insert("A %s B %s"))

-4

আপনি কি। ফর্ম্যাট দিয়ে চেষ্টা করেছেন?

স্ট্রিং.ফর্ম্যাট (0 = মান, 1 = মান)

তাই:

"A {0} B {1}".format(0=value, 1=value)


1
এটি কীভাবে কাউকে রূপান্তরিত %sকরতে সহায়তা করে {}?
অরণ-
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.