python সহজ আমি কিভাবে পাইথন এর itertools.groupby() ব্যবহার করব?




সহজ ভাষায় পাইথন ৩ pdf (10)

Python's itertools.groupby() ফাংশনটি আসলে কীভাবে ব্যবহার করতে হয় সে সম্পর্কে আমি বুঝতে পারছি না। আমি কি করার চেষ্টা করছি এই হল:

  • একটি তালিকা নিন - এই ক্ষেত্রে, একটি বস্তুগত lxml উপাদান শিশুদের
  • কিছু মানদণ্ড উপর ভিত্তি করে গ্রুপে বিভক্ত
  • তারপর পৃথকভাবে এই গ্রুপ প্রতিটি উপর পুনরাবৃত্তি।

আমি ডকুমেন্টেশন , এবং উদাহরণ পর্যালোচনা করেছি, কিন্তু আমি সংখ্যার একটি সহজ তালিকা অতিক্রম তাদের প্রয়োগ করার চেষ্টা করতে সমস্যা হয়েছে।

সুতরাং, আমি itertools.groupby() এর itertools.groupby() ব্যবহার করব? আমি ব্যবহার করা উচিত অন্য কৌশল আছে? ভাল "পূর্বশর্ত" পড়া পয়েন্ট এছাড়াও প্রশংসা করা হবে।


গ্রুপবইয়ের সাথে একটি নিয়তি কৌশল একটি লাইনের দৈর্ঘ্য এনকোডিং চালানো হয়:

[(c,len(list(cgen))) for c,cgen in groupby(some_string)]

আপনাকে 2-টিপলগুলির একটি তালিকা দেবে যেখানে প্রথম উপাদানটি গৃহস্থালি এবং দ্বিতীয়টি পুনরাবৃত্তি সংখ্যা।

সম্পাদনা: নোট করুন যে itertools.groupby GROUP BY semantics থেকে itertools.groupby কে আলাদা করে: এটির্টোলগুলি পূর্বে (এবং সাধারণভাবে নয়) ইটিয়েটারটিকে সাজানোর মতো করে না, তাই একই "কী" সহ গোষ্ঠীগুলি একত্রিত হয় না।


itertools.groupby আইটেম গ্রুপের জন্য একটি হাতিয়ার।

ডক্স থেকে, আমরা কী করতে পারি তা আরও শিখি :

# [k for k, g in groupby('AAAABBBCCDAABBB')] --> ABCDAB

# [list(g) for k, g in groupby('AAAABBBCCD')] --> AAAA BBB CC D

groupby বস্তুগুলি কী-গ্রুপ জোড়া উৎপন্ন করে যেখানে গ্রুপ একটি জেনারেটর হয়।

বৈশিষ্ট্য

  • একসঙ্গে গ্রুপ একযোগে আইটেম
  • বি। একটি আইটেমের সব ঘটনা, একটি সাজানো পুনরাবৃত্তি দেওয়া গ্রুপ
  • কী কী কী কী ফাংশন দিয়ে আইটেমগুলি গোষ্ঠী করা যায় তা নির্দিষ্ট করুন

তুলনা

# Define a printer for comparing outputs
>>> def print_groupby(iterable, key=None):
...    for k, g in it.groupby(iterable, key):
...        print("key: '{}'--> group: {}".format(k, list(g)))

# Feature A: group consecutive occurrences
>>> print_groupby("BCAACACAADBBB")
key: 'B'--> group: ['B']
key: 'C'--> group: ['C']
key: 'A'--> group: ['A', 'A']
key: 'C'--> group: ['C']
key: 'A'--> group: ['A']
key: 'C'--> group: ['C']
key: 'A'--> group: ['A', 'A']
key: 'D'--> group: ['D']
key: 'B'--> group: ['B', 'B', 'B']

# Feature B: group all occurrences
>>> print_groupby(sorted("BCAACACAADBBB"))
key: 'A'--> group: ['A', 'A', 'A', 'A', 'A']
key: 'B'--> group: ['B', 'B', 'B', 'B']
key: 'C'--> group: ['C', 'C', 'C']
key: 'D'--> group: ['D']

# Feature C: group by a key function
>>> key = lambda x: x.islower()
>>> print_groupby(sorted("bCAaCacAADBbB"), key)
key: 'False'--> group: ['A', 'A', 'A', 'B', 'B', 'C', 'C', 'D']
key: 'True'--> group: ['a', 'a', 'b', 'b', 'c']

ব্যবহারসমূহ

দ্রষ্টব্য: পরবর্তী কয়েকটি উদাহরণ ভিক্টর টেরন এর পিকন (talk) (Spanish) , "ডং উইথ ইটারটোলস এ কুং ফু"। সি এ লিখিত groupby সোর্স কোডটি দেখুন।

প্রতিক্রিয়া

# OP: Yes, you can use `groupby`, e.g. 
[do_something(list(g)) for _, g in groupby(lxml_elements, key=criteria_func)]

আপনি কি আমাদের কোড প্রদর্শন করতে পারেন?

পাইথন ডক্সগুলির উদাহরণটি বেশ সহজ:

groups = []
uniquekeys = []
for k, g in groupby(data, keyfunc):
    groups.append(list(g))      # Store group iterator as a list
    uniquekeys.append(k)

সুতরাং আপনার ক্ষেত্রে, তথ্য নোডের একটি তালিকা, keyfunc হয় যেখানে আপনার মানদণ্ডের ফাংশনটির লজিক চলে যায় এবং তারপরে groupby() গোষ্ঠীগুলিকে তথ্য দেয়।

আপনি groupby কল করার আগে এটি মাপকাঠি দ্বারা তথ্য বাছাই করা বা এটি কাজ করবে না সতর্কতা অবলম্বন করা আবশ্যক। groupby পদ্ধতি আসলে শুধুমাত্র একটি তালিকা মাধ্যমে পুনরাবৃত্তি এবং যখনই প্রধান পরিবর্তন এটি একটি নতুন গ্রুপ তৈরি করে।


আমি অন্য উদাহরণ দিতে চাই যেখানে সাজানো ছাড়া groupby কাজ করছে না। জেমস Sulak দ্বারা উদাহরণ থেকে অ্যাডাপ্টেড

from itertools import groupby

things = [("vehicle", "bear"), ("animal", "duck"), ("animal", "cactus"), ("vehicle", "speed boat"), ("vehicle", "school bus")]

for key, group in groupby(things, lambda x: x[0]):
    for thing in group:
        print "A %s is a %s." % (thing[1], key)
    print " "

আউটপুট হয়

A bear is a vehicle.

A duck is a animal.
A cactus is a animal.

A speed boat is a vehicle.
A school bus is a vehicle.

যানবাহন সঙ্গে দুটি গ্রুপ আছে, এক শুধুমাত্র এক গ্রুপ আশা করতে পারে


আমি কিভাবে পাইথন এর itertools.groupby () ব্যবহার করব?

আপনি groupy জিনিস উপর পুনরাবৃত্তি করতে জিনিস ব্যবহার করতে পারেন। আপনি গ্রুপের মাধ্যমে একটি পুনরাবৃত্তিযোগ্য এবং একটি ঐচ্ছিক কী ফাংশন / কলযোগ্য যা আইটেমগুলিকে পুনরাবৃত্তি থেকে বের করে দেওয়ার জন্য চেক করে এবং এটি একটি পুনরাবৃত্তিকারীকে ফেরত দেয় যা কী কলযোগ্য এবং আসল আইটেমগুলির ফলাফলের দুটি টুপি দেয় আরেকটি পুনরাবৃত্তিযোগ্য। সাহায্য থেকে:

groupby(iterable[, keyfunc]) -> create an iterator which returns
(key, sub-iterator) grouped by each value of key(value).

এখানে গণনা দ্বারা গ্রুপের জন্য একটি কোরিয়াইন ব্যবহার করে একটি উদাহরণ রয়েছে, এটি একটি মূল কলযোগ্য (এই ক্ষেত্রে, coroutine.send ) ব্যবহার করে যা কেবলমাত্র অনেক পুনরাবৃত্তি এবং উপাদানের একটি গোষ্ঠীযুক্ত উপ-ইটারারেটরের জন্য গণনা করা যায়:

import itertools


def grouper(iterable, n):
    def coroutine(n):
        yield # queue up coroutine
        for i in itertools.count():
            for j in range(n):
                yield i
    groups = coroutine(n)
    next(groups) # queue up coroutine

    for c, objs in itertools.groupby(iterable, groups.send):
        yield c, list(objs)
    # or instead of materializing a list of objs, just:
    # return itertools.groupby(iterable, groups.send)

list(grouper(range(10), 3))

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

[(0, [0, 1, 2]), (1, [3, 4, 5]), (2, [6, 7, 8]), (3, [9])]

গুরুত্বপূর্ণ উল্লেখ্য: আপনি আপনার তথ্য প্রথম সাজানোর আছে।

অংশ আমি না পাওয়া যায় উদাহরণস্বরূপ

groups = []
uniquekeys = []
for k, g in groupby(data, keyfunc):
   groups.append(list(g))    # Store group iterator as a list
   uniquekeys.append(k)

k বর্তমান গ্রুপিং কী এবং জিটি একটি ইন্টেরেটর যা আপনি গোষ্ঠী কী দ্বারা সংজ্ঞায়িত গোষ্ঠীর উপর পুনরাবৃত্তি করতে ব্যবহার করতে পারেন। অন্য কথায়, groupby ইটারারেটর নিজেই groupby ফেরত দেয়।

এখানে একটি উদাহরণ, পরিষ্কার পরিবর্তনশীল নাম ব্যবহার করে:

from itertools import groupby

things = [("animal", "bear"), ("animal", "duck"), ("plant", "cactus"), ("vehicle", "speed boat"), ("vehicle", "school bus")]

for key, group in groupby(things, lambda x: x[0]):
    for thing in group:
        print "A %s is a %s." % (thing[1], key)
    print " "

এটি আপনাকে আউটপুট দেবে:

একটি ভালুক একটি প্রাণী।
একটি হাঁস একটি প্রাণী।

একটি ক্যাকটাস একটি উদ্ভিদ।

একটি গতি নৌকা একটি গাড়ির।
একটি স্কুল বাস একটি গাড়ির।

এই উদাহরণে, things টিপলগুলির একটি তালিকা যেখানে প্রতিটি টিপলে প্রথম আইটেমটি দ্বিতীয় আইটেমটির সাথে যুক্ত হয়।

groupby() ফাংশন দুটি আর্গুমেন্ট গ্রহণ করে: (1) গোষ্ঠী থেকে তথ্য এবং (2) ফাংশন এটি সাথে গ্রুপ।

এখানে, lambda x: x[0] groupby() কে grouping key হিসাবে প্রতিটি groupby() প্রথম আইটেমটি ব্যবহার করতে বলে।

বিবরণের for উপরে, groupby তিনটি (কী, গোষ্ঠী groupby ) জোড়া দেয় - একবার প্রতিটি অনন্য কী জন্য। আপনি যে দলের প্রতিটি আইটেমের উপর পুনরাবৃত্তি করার জন্য ফেরত এটিরটার ব্যবহার করতে পারেন।

একটি তালিকা বোঝার ব্যবহার করে, একই তথ্য সহ এখানে একটি সামান্য উদাহরণ রয়েছে:

for key, group in groupby(things, lambda x: x[0]):
    listOfThings = " and ".join([thing[1] for thing in group])
    print key + "s:  " + listOfThings + "."

এটি আপনাকে আউটপুট দেবে:

প্রাণী: বিয়ার এবং হাঁস।
গাছপালা: ক্যাকটাস।
যানবাহন: গতি নৌকা এবং স্কুল বাস।


@ ক্যাপ্টসোলো, আমি আপনার উদাহরণ চেষ্টা করেছি, কিন্তু এটি কাজ করে নি।

from itertools import groupby 
[(c,len(list(cs))) for c,cs in groupby('Pedro Manoel')]

আউটপুট:

[('P', 1), ('e', 1), ('d', 1), ('r', 1), ('o', 1), (' ', 1), ('M', 1), ('a', 1), ('n', 1), ('o', 1), ('e', 1), ('l', 1)]

আপনি দেখতে পারেন, দুই o এবং দুই e আছে, কিন্তু তারা পৃথক গ্রুপে পেয়েছিলাম। আমি বুঝতে পেরেছি যে আপনি groupby ফাংশন পাস তালিকা সাজানোর প্রয়োজন। সুতরাং, সঠিক ব্যবহার হবে:

name = list('Pedro Manoel')
name.sort()
[(c,len(list(cs))) for c,cs in groupby(name)]

আউটপুট:

[(' ', 1), ('M', 1), ('P', 1), ('a', 1), ('d', 1), ('e', 2), ('l', 1), ('n', 1), ('o', 2), ('r', 1)]

তালিকাটি সাজানো না থাকলেই মনে রাখবেন, গ্রুপের ফাংশন কাজ করবে না !


সতর্কতা:

সিনট্যাক্স তালিকা (groupby (...)) আপনি চান যে উপায় কাজ করবে না। এটি অভ্যন্তরীণ ইয়ারেটার বস্তু ধ্বংস করে বলে মনে হচ্ছে

for x in list(groupby(range(10))):
    print(list(x[1]))

উত্পাদন করবে

[]
[]
[]
[]
[]
[]
[]
[]
[]
[9]

পরিবর্তে, তালিকার (groupby (...)), k (g), g groupby (...)] এর জন্য [(k, list (g)) চেষ্টা করুন, অথবা আপনি যে সিনট্যাক্সটি প্রায়ই ব্যবহার করেন,

def groupbylist(*args, **kwargs):
    return [(k, list(g)) for k, g in groupby(*args, **kwargs)]

এবং একসঙ্গে যারা pesky (ছোট তথ্য) iterators এড়ানো যখন groupby কার্যকারিতা অ্যাক্সেস পেতে।


আমি যে একটি দরকারী উদাহরণ জুড়ে এসেছি তা সহায়ক হতে পারে:

from itertools import groupby

#user input

myinput = input()

#creating empty list to store output

myoutput = []

for k,g in groupby(myinput):

    myoutput.append((len(list(g)),int(k)))

print(*myoutput)

নমুনা ইনপুট: 14445221

নমুনা আউটপুট: (1,1) (3,4) (1,5) (২2) (1,1)


আপনি নিজের groupby ফাংশন লিখতে পারেন:

           def groupby(data):
                kv = {}
                for k,v in data:
                    if k not in kv:
                         kv[k]=[v]
                    else:
                        kv[k].append(v)
           return kv

     Run on ipython:
       In [10]: data = [('a', 1), ('b',2),('a',2)]

        In [11]: groupby(data)
        Out[11]: {'a': [1, 2], 'b': [2]}




iteration