তালিকায় উপাদানগুলি সন্ধান এবং প্রতিস্থাপন করা


273

আমাকে একটি তালিকার সন্ধান করতে হবে এবং একটি উপাদানের সমস্ত উপস্থিতি অন্যটির সাথে প্রতিস্থাপন করতে হবে। এখন পর্যন্ত কোডে আমার প্রচেষ্টা আমাকে কোথাও পাচ্ছে না, এটি করার সর্বোত্তম উপায় কী?

উদাহরণস্বরূপ, ধরুন আমার তালিকার নীচের পূর্ণসংখ্যা রয়েছে

>>> a = [1,2,3,4,5,1,2,3,4,5,1]

এবং আমার 1 নম্বরটির সমস্ত উপস্থিতি 10 মানের সাথে প্রতিস্থাপন করতে হবে যাতে আমার আউটপুটটি প্রয়োজন

>>> a = [10, 2, 3, 4, 5, 10, 2, 3, 4, 5, 10]

সুতরাং আমার লক্ষ্যটি হ'ল 1 নম্বরটির সমস্ত দৃষ্টান্তটি 10 ​​নম্বর দিয়ে প্রতিস্থাপন করা।


11
এটা কি জন্য?
outis

উত্তর:


250
>>> a= [1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1]
>>> for n, i in enumerate(a):
...   if i == 1:
...      a[n] = 10
...
>>> a
[10, 2, 3, 4, 5, 10, 2, 3, 4, 5, 10]

15
এটি একটি খারাপ এবং খুব অ-পাইথোনিক সমাধান। তালিকা বোঝার ব্যবহার বিবেচনা করুন।
অ্যাডহোমাইনেম

203
খুব আন-পাইথোনিক সমাধান হলে এটি একটি সূক্ষ্ম। তালিকা বোঝার ব্যবহার বিবেচনা করুন।
জিন-

নীচে @ আউটস দ্বারা সম্পন্ন যেমন তালিকা বোঝার ব্যবহার বিবেচনা করুন!
এএমসি

6
এই তালিকা বোধগমনের চেয়ে ভাল সম্পাদন করে না কেন? এটি নতুন তালিকা তৈরির পরিবর্তে স্থান পরিবর্তন করে আপডেট করে।
neverendingqs

@ নিউভেরিডিংকস: না। সংক্ষেপে ওভারহেড অপারেশনটিতে আধিপত্য বিস্তার করে এবং বোধগম্যতার কম থাকে। বোধগম্যতা কিছুটা ভাল সম্পাদন করে, বিশেষত প্রতিস্থাপনের শর্তটি অতিক্রম করার উপাদানগুলির একটি উচ্চ অনুপাতের সাথে। কিছু সময় আছে: আদর্শ one.com/ZrCy6z
ব্যবহারকারী

517

একটি তালিকা বোধগম্য এবং তিনটি অপারেটর ব্যবহার করে দেখুন ।

>>> a=[1,2,3,1,3,2,1,1]
>>> [4 if x==1 else x for x in a]
[4, 2, 3, 4, 3, 2, 4, 4]

9
তবে aঠিক কি এই পরিবর্তন হয় না ? আমি মনে করি ওপি aপরিবর্তন করতে চেয়েছিল
ডুলা

10
@ দুলা আপনি একটি = [4 যদি x == 1 এর জন্য এক্স এর জন্য আরও 1 এক্স] করতে পারেন তবে এটি একটি প্রভাব ফেলবে
আলেখ্যা ভেম্বরপু

@ দুলা: প্রশ্নটি aপরিবর্তন হওয়া উচিত কিনা তা অস্পষ্ট , কিন্তু (আলেখায়া দেখায়) তালিকা বোধগম্যতা ব্যবহার করার সময় উভয় ক্ষেত্রেই পরিচালনা করা তুচ্ছ।
outis

34
আপনি যদি রূপান্তর করতে চান aতবে আপনার করা উচিত a[:] = [4 if x==1 else x for x in a](সম্পূর্ণ তালিকা স্লাইসটি নোট করুন)। কেবলমাত্র কাজটি করা আসলটি থেকে আলাদা (পরিচয়) দিয়ে a =একটি নতুন তালিকা তৈরি করবেaid()
ক্রিস_আরান্ডস

39

তালিকা উপলব্ধি ভাল কাজ করে, এবং গণনা সহ লুপিং আপনাকে কিছু স্মৃতি বাঁচাতে পারে (বি / সি অপারেশনটি মূলত স্থানে চলছে)।

এখানে কার্যকরী প্রোগ্রামিংও রয়েছে। মানচিত্রের ব্যবহার দেখুন :

>>> a = [1,2,3,2,3,4,3,5,6,6,5,4,5,4,3,4,3,2,1]
>>> map(lambda x: x if x != 4 else 'sss', a)
[1, 2, 3, 2, 3, 'sss', 3, 5, 6, 6, 5, 'sss', 5, 'sss', 3, 'sss', 3, 2, 1]

17
+1 টি। এটি খুব খারাপ lambdaএবং mapঅযৌক্তিক হিসাবে বিবেচিত হয়।
outis

4
আমি নিশ্চিত নই যে ল্যাম্বদা বা মানচিত্রটি সহজাতভাবে অসম্পূর্ণ, তবে আমি সম্মত হই যে একটি তালিকা বোধগম্য দু'টি সংযোগে ব্যবহারের চেয়ে পরিষ্কার এবং আরও পঠনযোগ্য।
দামজাম

7
আমি এগুলিকে নিজেই অযৌক্তিক বলে বিবেচনা করি না, তবে গুডো ভ্যান রসুম ( artima.com/weblogs/viewpost.jsp?thread=98196 ) সহ অনেকেই করেন । এটি সেই সম্প্রদায়গত বিষয়গুলির মধ্যে একটি।
outis

35

প্রতিস্থাপনের জন্য যদি আপনার বেশ কয়েকটি মান থাকে তবে আপনি একটি অভিধানও ব্যবহার করতে পারেন:

a = [1, 2, 3, 4, 1, 5, 3, 2, 6, 1, 1]
dic = {1:10, 2:20, 3:'foo'}

print([dic.get(n, n) for n in a])

> [10, 20, 'foo', 4, 10, 5, 'foo', 20, 6, 10, 10]

1
nএটি যদি খুঁজে না পাওয়া যায় তবে ত্রুটি ছুঁড়ে না dic?
নীল এ।

3
@ user2914540 আমি আপনার উত্তরটি কিছুটা উন্নত করেছি যাতে এটি nপাওয়া না গেলে এটি কাজ করে । আমি আশা করি আপনি কিছু মনে করবেন না। আপনার try/exceptসমাধান ভাল ছিল না।
jrjc

ওহ হ্যাঁ, এটি আরও ভাল।
রোপোসিয়েরে

1
ইন-প্লেস প্রতিস্থাপনের জন্য @jrjc @roipoussiere, try-exceptকমপক্ষে 50% দ্রুত! এই উত্তরটি
23:25

4
if n in dic.keys()খারাপ কর্মক্ষমতা অনুযায়ী। ব্যবহার করুন if n in dicবা dic.get(n,n)(ডিফল্ট মান)
জিন-ফ্রান্সোইস ফ্যাব্রে

12
>>> a=[1,2,3,4,5,1,2,3,4,5,1]
>>> item_to_replace = 1
>>> replacement_value = 6
>>> indices_to_replace = [i for i,x in enumerate(a) if x==item_to_replace]
>>> indices_to_replace
[0, 5, 10]
>>> for i in indices_to_replace:
...     a[i] = replacement_value
... 
>>> a
[6, 2, 3, 4, 5, 6, 2, 3, 4, 5, 6]
>>> 

মাঝারি দ্রুত কিন্তু খুব বুদ্ধিমান পদ্ধতি। আমার উত্তরে সময় দেখুন।
ডগ

10
a = [1,2,3,4,5,1,2,3,4,5,1,12]
for i in range (len(a)):
    if a[i]==2:
        a[i]=123

আপনি লুপের জন্য এবং যখন ব্যবহার করতে পারেন; তবে আপনি যদি বিল্টিন এনুমারেট ফাংশনটি জানেন, তবে এটি গণনা ব্যবহার করার পরামর্শ দেওয়া হচ্ছে। 1


1
আপনি যখন তালিকা আইটেমগুলিতে আরও জটিল ক্রিয়াকলাপ করবেন তখন এটি করার একমাত্র বুদ্ধিমান (পাঠযোগ্য) উপায়। উদাহরণস্বরূপ, প্রতিটি তালিকার আইটেম যদি একটি দীর্ঘ স্ট্রিং থাকে তবে এটির জন্য কোনও ধরণের অনুসন্ধান এবং প্রতিস্থাপনের প্রয়োজন হয়।
not2qubit

8

সব সহজে প্রতিস্থাপন করতে 1সঙ্গে 10মধ্যে a = [1,2,3,4,5,1,2,3,4,5,1]এক নিম্নলিখিত এক লাইন ল্যামডা + + মানচিত্র সংমিশ্রণ ব্যবহার করতে পারে, এবং 'দেখ, মা, কোন Ifs বা Fors!' :

# This substitutes all '1' with '10' in list 'a' and places result in list 'c':

c = list(map(lambda b: b.replace("1","10"), a))


এখন পর্যন্ত সবচেয়ে ধীর পদ্ধতি। আপনি lambdaপ্রতিটি তালিকার উপাদানগুলিতে একটি কল করছেন ...
ডগ

4

পাইথন ২.x এ নিম্নলিখিতটি একটি খুব সরাসরি পদ্ধতি method

 a = [1,2,3,4,5,1,2,3,4,5,1]        #Replacing every 1 with 10
 for i in xrange(len(a)):
   if a[i] == 1:
     a[i] = 10  
 print a

এই পদ্ধতি কাজ করে। মন্তব্য স্বাগত। আশা করি এটা সাহায্য করবে :)

আউটিস এবং ড্যামজামের সমাধানগুলি কীভাবে কাজ করে তা বোঝার চেষ্টা করুন । তালিকা সংক্ষেপণ এবং ল্যাম্বদা ফাংশন দরকারী সরঞ্জাম।


3

আমি জানি এটি একটি খুব পুরানো প্রশ্ন এবং এটি করার অনেকগুলি উপায় আছে। আমি খুঁজে পাওয়া সবচেয়ে সহজ একটি numpyপ্যাকেজ ব্যবহার করা হয় ।

import numpy

arr = numpy.asarray([1, 6, 1, 9, 8])
arr[ arr == 8 ] = 0 # change all occurrences of 8 by 0
print(arr)

3

আমার ইউজকেস Noneকিছু ডিফল্ট মান দিয়ে প্রতিস্থাপন করছিল ।

@Kxr- এর ব্যবহার সহ - এখানে এখানে উপস্থাপিত এই সমস্যার দিকে আমি সময়সীমা বেঁধেছি str.count

পাইথনের সাথে আইপথনে টেস্ট কোড 3.8.1:

def rep1(lst, replacer = 0):
    ''' List comprehension, new list '''

    return [item if item is not None else replacer for item in lst]


def rep2(lst, replacer = 0):
    ''' List comprehension, in-place '''    
    lst[:] =  [item if item is not None else replacer for item in lst]

    return lst


def rep3(lst, replacer = 0):
    ''' enumerate() with comparison - in-place '''
    for idx, item in enumerate(lst):
        if item is None:
            lst[idx] = replacer

    return lst


def rep4(lst, replacer = 0):
    ''' Using str.index + Exception, in-place '''

    idx = -1
    # none_amount = lst.count(None)
    while True:
        try:
            idx = lst.index(None, idx+1)
        except ValueError:
            break
        else:
            lst[idx] = replacer

    return lst


def rep5(lst, replacer = 0):
    ''' Using str.index + str.count, in-place '''

    idx = -1
    for _ in range(lst.count(None)):
        idx = lst.index(None, idx+1)
        lst[idx] = replacer

    return lst


def rep6(lst, replacer = 0):
    ''' Using map, return map iterator '''

    return map(lambda item: item if item is not None else replacer, lst)


def rep7(lst, replacer = 0):
    ''' Using map, return new list '''

    return list(map(lambda item: item if item is not None else replacer, lst))


lst = [5]*10**6
# lst = [None]*10**6

%timeit rep1(lst)    
%timeit rep2(lst)    
%timeit rep3(lst)    
%timeit rep4(lst)    
%timeit rep5(lst)    
%timeit rep6(lst)    
%timeit rep7(lst)    

আমি পাই:

26.3 ms ± 163 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
29.3 ms ± 206 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
33.8 ms ± 191 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
11.9 ms ± 37.8 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
11.9 ms ± 60.2 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
260 ns ± 1.84 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
56.5 ms ± 204 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

অভ্যন্তরীণ ব্যবহার করা str.indexযেকোন ম্যানুয়াল তুলনার তুলনায় দ্রুত।

আমি জানতাম না পরীক্ষায় 4 ব্যতিক্রমটি ব্যবহারের চেয়ে বেশি শ্রমসাধ্য হবে str.count, পার্থক্যটি নগণ্য বলে মনে হচ্ছে।

নোট করুন যে map()(পরীক্ষা 6) একটি পুনরাবৃত্তিকে রিটার্ন দেয় এবং প্রকৃত তালিকা দেয় না, এইভাবে পরীক্ষা 7।


3

দীর্ঘ তালিকাগুলিতে এবং বিরল ঘটনাগুলির সাথে এর প্রায় 3x দ্রুত ব্যবহার করে list.index()- অন্যান্য উত্তরে উপস্থাপিত একক পদক্ষেপ পুনরাবৃত্তি পদ্ধতির তুলনায়।

def list_replace(lst, old=1, new=10):
    """replace list elements (inplace)"""
    i = -1
    try:
        while 1:
            i = lst.index(old, i + 1)
            lst[i] = new
    except ValueError:
        pass

এটি আমি খুঁজে পাওয়া দ্রুততম পদ্ধতি। আমার উত্তরে সময় দেখুন। গ্রেট!
ডগ

2

আপনি কেবল পাইথনে তালিকার বোঝাপড়াটি ব্যবহার করতে পারেন:

def replace_element(YOUR_LIST, set_to=NEW_VALUE):
    return [i
            if SOME_CONDITION
            else NEW_VALUE
            for i in YOUR_LIST]

আপনার ক্ষেত্রে, যেখানে আপনি 1 এর সমস্ত উপস্থিতি 10 এর সাথে প্রতিস্থাপন করতে চান, কোড স্নিপেটটি এরকম হবে:

def replace_element(YOUR_LIST, set_to=10):
    return [i
            if i != 1  # keeps all elements not equal to one
            else set_to  # replaces 1 with 10
            for i in YOUR_LIST]

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

-1

কেবল একটি আইটেম সন্ধান করুন এবং প্রতিস্থাপন করুন

ur_list = [1,2,1]     # replace the first 1 wiz 11

loc = ur_list.index(1)
ur_list.remove(1)
ur_list.insert(loc, 11)

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