ছোট তালিকাতে বিভক্ত তালিকা (অর্ধেক অংশে বিভক্ত)


150

আমি অজগর তালিকার অর্ধেক অংশ সহজেই বিভক্ত করার একটি উপায় খুঁজছি।

যাতে আমার যদি একটি অ্যারে থাকে:

A = [0,1,2,3,4,5]

আমি পেতে সক্ষম হবে:

B = [0,1,2]

C = [3,4,5]

উত্তর:


226
A = [1,2,3,4,5,6]
B = A[:len(A)//2]
C = A[len(A)//2:]

আপনি যদি একটি ফাংশন চান:

def split_list(a_list):
    half = len(a_list)//2
    return a_list[:half], a_list[half:]

A = [1,2,3,4,5,6]
B, C = split_list(A)

70
পাইথন 3 তে আপনাকে বাধ্যতামূলকভাবে বিভাগ ভাগ করতে হবে // // প্রয়োজনীয়।
স্টিফান কেন্ডাল

4
সুন্দর সমাধান, ধন্যবাদ। এটি পাইথন B = A[:(len(A) // 10) * 8] C = A[(len(A) // 10) * 8:]
এম

87

আরও কিছু জেনেরিক সমাধান (আপনি কেবল 'অর্ধেক ভাগ' না করে নিজের পছন্দসই অংশগুলি নির্দিষ্ট করতে পারেন):

সম্পাদনা : বিজোড় তালিকা দৈর্ঘ্য পরিচালনা করতে পোস্ট আপডেট

EDIT2 : ব্রায়ানস তথ্যমূলক মন্তব্যের উপর ভিত্তি করে আপডেট পোস্ট আবার

def split_list(alist, wanted_parts=1):
    length = len(alist)
    return [ alist[i*length // wanted_parts: (i+1)*length // wanted_parts] 
             for i in range(wanted_parts) ]

A = [0,1,2,3,4,5,6,7,8,9]

print split_list(A, wanted_parts=1)
print split_list(A, wanted_parts=2)
print split_list(A, wanted_parts=8)

2
যখন তালিকাটি সমানভাবে বিভক্ত হয় না (যেমন স্প্লিট_লিস্ট ([1,2,3], 2)) এটি আসলে ওয়ান্ট_ পার্টস +1 তালিকাগুলি ফিরে আসবে।
ব্রায়ান

3
আমি মনে করি এর চেয়ে ভাল উপায় হ'ল দৈর্ঘ্য = লেন (আলিস্ট); ফিরে আসুন [আমি [দৈর্ঘ্য // দৈর্ঘ্য // ওয়ান্ট_ পার্টস: (আই + 1) * দৈর্ঘ্য // ওয়ান্ট_ পার্টস] আই ইন ইন রেঞ্জের জন্য (ওয়ান্টেড পার্টস]]] return এইভাবে আপনি যথাসময়ে বিতরণ পাবেন এবং সর্বদা হ'ল পছন্দসই আইটেম (আইটেমের সাথে প্যাডগুলিও চাইলে [অংশগুলি> লেন (এ)) পান
ব্রায়ান

2
হাই .. প্রতীক "//" এর অর্থ কী ??
ফ্রেজম্যান

2
@ ফ্রাজ এটি ইনলাইন মন্তব্য হিসাবে বোঝানো হয়েছে। স্ক্রিপ্ট সম্পাদন করতে "// ওয়ান্ট_ পার্টস" এবং "// ওয়ান্টেড পার্টস" উপেক্ষা করুন।
পুঞ্জকডার

19
//মানে পূর্ণসংখ্যা বিভাজন। তারা এই কাজটি করার ক্ষেত্রে যথেষ্ট প্রয়োজনীয় বলে এগুলি বাদ দেওয়া উচিত নয়।
আলফাডেলটা 14

43
f = lambda A, n=3: [A[i:i+n] for i in range(0, len(A), n)]
f(A)

n - ফলাফল অ্যারেগুলির পূর্বনির্ধারিত দৈর্ঘ্য


1
এটি আমার পরিস্থিতিতে দুর্দান্ত কাজ করে, তবে এটি প্রতিটি তালিকার প্রতিটি অন্যান্য শেষ সূচককে তার নিজস্ব তালিকায় যুক্ত করে। ব্যাখ্যা করা কঠিন. আপনি যদি সহায়তা করতে পারেন তবে উত্তর দিন এবং আমি আরও ব্যাখ্যা করব।
মাইক ইসা

34
def split(arr, size):
     arrs = []
     while len(arr) > size:
         pice = arr[:size]
         arrs.append(pice)
         arr   = arr[size:]
     arrs.append(arr)
     return arrs

টেস্ট:

x=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
print(split(x, 5))

ফলাফল:

[[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13]]

1
তালিকাটি ম্যাট্রিক্সে রূপান্তর করতেও দরকারী
এমপিএনজি

এটি কাজ করে, তবে বেশ নয়। আমি একটি লুপে এই ফাংশনটি ব্যবহার করছি, এবং দৈর্ঘ্য পৃথক। অন্য কথায়: for i,j in zip(list,lengths): print(split(i,j))listএবং lengthsতালিকা একই দৈর্ঘ্য আছে। জে পর্যায়ক্রমে চলছে: 5,4,5,4,5, এবং বিভক্ত ফাংশনটি প্রথম দুটি পর্যায়ক্রমে কাজ করে, যেমন এটি iতালিকার প্রথমটি 5 এবং 4 দ্বারা বিভক্ত করে তোলে, তবে পরবর্তী পুনরাবৃত্তির উপর এটি 4,4 এ বিভক্ত হয়, 1। : \ আপনি যদি আমাকে আরও ব্যাখ্যা করতে চান তবে দয়া করে উত্তর দিন (একটি নতুন প্রশ্ন পোস্ট করুন)
মাইক ইসা

15

আপনি যদি অর্ডারটি যত্ন না করেন ...

def split(list):  
    return list[::2], list[1::2]

list[::2]0 তম উপাদান থেকে শুরু করে তালিকায় প্রতিটি দ্বিতীয় উপাদান পায়।
list[1::2]তালিকার প্রতিটি দ্বিতীয় উপাদান 1 ম উপাদান থেকে শুরু করে।


4
সাবধানে অন্তর্নির্মিত listছায়া দিয়ে আর্গ নামকরণ list(...)। আমি এড়াতে সাধারণভাবে দেখেছি lstএবং list_ব্যবহার করেছি ।
টেলর এডমিস্টন

3
এটি সবচেয়ে পাইথোনিক অনুভব করে (ভুল নাম উপেক্ষা করে)
টজোররিমোর্রি



9
def splitter(A):
    B = A[0:len(A)//2]
    C = A[len(A)//2:]

 return (B,C)

আমি পরীক্ষা করেছিলাম, এবং ডাবল স্ল্যাশটি অজগর 3 তে ইন্টি বিভাজন বাধ্যতামূলক করা আবশ্যক My


এটি বিজোড় লেন (এ) পরিচালনা করে না - আপনি কি এর সমাধান পেতে পারেন?
N997

6

আকারের ছোট অ্যারেগুলিতে কোনও অ্যারে বিভক্ত করার আরও সাধারণীকরণের ক্ষেত্রে অফিসিয়াল পাইথন রিসিপ রয়েছে n

from itertools import izip_longest
def grouper(n, iterable, fillvalue=None):
    "Collect data into fixed-length chunks or blocks"
    # grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *args)

এই কোড স্নিপেট পাইথন ইটারটুলস ডক পৃষ্ঠা থেকে


6

তালিকা টুকরা ব্যবহার । বাক্য গঠনটি মূলতঃmy_list[start_index:end_index]

>>> i = [0,1,2,3,4,5]
>>> i[:3] # same as i[0:3] - grabs from first to third index (0->2)
[0, 1, 2]
>>> i[3:] # same as i[3:len(i)] - grabs from fourth index to end
[3, 4, 5]

তালিকার প্রথম অর্ধেক পেতে, আপনি প্রথম সূচক থেকে টুকরো টুকরো করুন len(i)//2(যেখানে //পূর্ণসংখ্যা বিভাগ - সুতরাং 3//2 will give the floored result of1 , instead of the invalid list index of1.5`):

>>> i[:len(i)//2]
[0, 1, 2]

.. এবং দ্বিতীয় অর্ধের জন্য মানগুলি অদলবদল করুন:

>>> i[len(i)//2:]
[3, 4, 5]

বিজোড় লেন তালিকাগুলি সম্পর্কে কী)
N997

@ N997 কোডটি এখনও কাজ করা উচিত; আপনি কেবল প্রতিটি তালিকার বিভিন্ন সংখ্যক আইটেম দিয়ে শেষ করেছেন। সুতরাং বলুন যে তালিকাটি তিনটি আইটেম দীর্ঘ, বিভাগ অপারেটর ফল 3//2দেয় যাতে ফলাফল দেয় 1, তারপরে আপনি i[:1]যা পান যা দেয় [0]এবং i[1:]যা দেয়[1, 2]
ডিবিআর

3

আপনার যদি একটি বড় তালিকা থাকে তবে প্রতিটি অংশটি প্রয়োজন অনুযায়ী ফলন করার জন্য এরটুলগুলি ব্যবহার করা এবং একটি ফাংশন লিখতে ভাল :

from itertools import islice

def make_chunks(data, SIZE):
    it = iter(data)
    # use `xragne` if you are in python 2.7:
    for i in range(0, len(data), SIZE):
        yield [k for k in islice(it, SIZE)]

আপনি এটি ব্যবহার করতে পারেন:

A = [0, 1, 2, 3, 4, 5, 6]

size = len(A) // 2

for sample in make_chunks(A, size):
    print(sample)

আউটপুটটি হ'ল:

[0, 1, 2]
[3, 4, 5]
[6]

@ থেফোর্তে এবং @ বেড কনস্ট্যান্টিনাইডসকে ধন্যবাদ


3

10 বছর পরে .. আমি ভেবেছিলাম - কেন অন্য একটি যোগ করবেন না:

arr = 'Some random string' * 10; n = 4
print([arr[e:e+n] for e in range(0,len(arr),n)])

2

উপরের উত্তরগুলি কম-বেশি সঠিক হলেও, আপনার অ্যারের আকারটি 2 দিয়ে বিভাজ্য না হলে আপনি সমস্যার মধ্যে পড়তে পারেন, ফলস্বরূপ a / 2, বিজোড় হওয়া অজগর 3.0.০ এ ভাসমান এবং আপনি যদি পূর্ববর্তী সংস্করণে যান তবে from __future__ import divisionআপনার স্ক্রিপ্টের শুরুতে নির্দিষ্ট করুন । আপনার কোডটির a // 2"ফরওয়ার্ড" সামঞ্জস্যতা পেতে আপনি কোনও ক্ষেত্রেই পূর্ণসংখ্যা বিভাগে যাওয়াই ভাল ।



0

@ ক্রিস্টোফিডের ইঙ্গিত সহ

def line_split(N, K=1):
    length = len(N)
    return [N[i*length/K:(i+1)*length/K] for i in range(K)]

A = [0,1,2,3,4,5,6,7,8,9]
print line_split(A,1)
print line_split(A,2)


0

2020-এ এই সমস্যাটিকে আরও একটি করে গ্রহণ করুন ... সমস্যাটির সাধারণীকরণ এখানে। আমি 'অর্ধেকের তালিকাকে অর্ধেক ভাগ' হিসাবে ব্যাখ্যা করব .. (যেমন দুটি তালিকাগুলি এবং কোনও বিজোড়ের ক্ষেত্রে তৃতীয় অ্যারেতে কোনও স্পিলওভার থাকবে না) ইত্যাদি। উদাহরণস্বরূপ, অ্যারের দৈর্ঘ্য যদি 19 হয় এবং // অপারেটর ব্যবহার করে দুটি দ্বারা বিভাজন 9 দেয়, এবং আমরা 9 ​​টি দৈর্ঘ্যের দুটি অ্যারে এবং 1 অ্যারে (তৃতীয়) দৈর্ঘ্যের 1 (সুতরাং মোট তিনটি অ্যারে) রেখে শেষ করব। যদি আমরা সারাক্ষণ দুটি অ্যারে দেওয়ার জন্য একটি সাধারণ সমাধান চাই, তবে আমি ধরে নেব যে আমরা ফলস্বরূপ দুজনের অ্যারেগুলির সাথে সুখী যা দৈর্ঘ্যের সমান নয় (একের তুলনায় অন্যটি দীর্ঘ হবে)। এবং এটি অর্ডার মিশ্রিত করা ঠিক হয়েছে বলে ধরে নেওয়া হয়েছে (এই ক্ষেত্রে বিকল্প) tern

"""
arrayinput --> is an array of length N that you wish to split 2 times
"""
ctr = 1 # lets initialize a counter

holder_1 = []
holder_2 = []

for i in range(len(arrayinput)): 

    if ctr == 1 :
        holder_1.append(arrayinput[i])
    elif ctr == 2: 
        holder_2.append(arrayinput[i])

    ctr += 1 

    if ctr > 2 : # if it exceeds 2 then we reset 
        ctr = 1 

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

শুধু আমার দুই সেন্ট।

ধন্যবাদ!

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