আমি অজগর তালিকার অর্ধেক অংশ সহজেই বিভক্ত করার একটি উপায় খুঁজছি।
যাতে আমার যদি একটি অ্যারে থাকে:
A = [0,1,2,3,4,5]
আমি পেতে সক্ষম হবে:
B = [0,1,2]
C = [3,4,5]
আমি অজগর তালিকার অর্ধেক অংশ সহজেই বিভক্ত করার একটি উপায় খুঁজছি।
যাতে আমার যদি একটি অ্যারে থাকে:
A = [0,1,2,3,4,5]
আমি পেতে সক্ষম হবে:
B = [0,1,2]
C = [3,4,5]
উত্তর:
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)
B = A[:(len(A) // 10) * 8]
C = A[(len(A) // 10) * 8:]
আরও কিছু জেনেরিক সমাধান (আপনি কেবল 'অর্ধেক ভাগ' না করে নিজের পছন্দসই অংশগুলি নির্দিষ্ট করতে পারেন):
সম্পাদনা : বিজোড় তালিকা দৈর্ঘ্য পরিচালনা করতে পোস্ট আপডেট
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)
//
মানে পূর্ণসংখ্যা বিভাজন। তারা এই কাজটি করার ক্ষেত্রে যথেষ্ট প্রয়োজনীয় বলে এগুলি বাদ দেওয়া উচিত নয়।
f = lambda A, n=3: [A[i:i+n] for i in range(0, len(A), n)]
f(A)
n
- ফলাফল অ্যারেগুলির পূর্বনির্ধারিত দৈর্ঘ্য
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]]
for i,j in zip(list,lengths): print(split(i,j))
। list
এবং lengths
তালিকা একই দৈর্ঘ্য আছে। জে পর্যায়ক্রমে চলছে: 5,4,5,4,5, এবং বিভক্ত ফাংশনটি প্রথম দুটি পর্যায়ক্রমে কাজ করে, যেমন এটি i
তালিকার প্রথমটি 5 এবং 4 দ্বারা বিভক্ত করে তোলে, তবে পরবর্তী পুনরাবৃত্তির উপর এটি 4,4 এ বিভক্ত হয়, 1। : \ আপনি যদি আমাকে আরও ব্যাখ্যা করতে চান তবে দয়া করে উত্তর দিন (একটি নতুন প্রশ্ন পোস্ট করুন)
আপনি যদি অর্ডারটি যত্ন না করেন ...
def split(list):
return list[::2], list[1::2]
list[::2]
0 তম উপাদান থেকে শুরু করে তালিকায় প্রতিটি দ্বিতীয় উপাদান পায়।
list[1::2]
তালিকার প্রতিটি দ্বিতীয় উপাদান 1 ম উপাদান থেকে শুরু করে।
list
ছায়া দিয়ে আর্গ নামকরণ list(...)
। আমি এড়াতে সাধারণভাবে দেখেছি lst
এবং list_
ব্যবহার করেছি ।
def splitter(A):
B = A[0:len(A)//2]
C = A[len(A)//2:]
return (B,C)
আমি পরীক্ষা করেছিলাম, এবং ডাবল স্ল্যাশটি অজগর 3 তে ইন্টি বিভাজন বাধ্যতামূলক করা আবশ্যক My
আকারের ছোট অ্যারেগুলিতে কোনও অ্যারে বিভক্ত করার আরও সাধারণীকরণের ক্ষেত্রে অফিসিয়াল পাইথন রিসিপ রয়েছে 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)
এই কোড স্নিপেট পাইথন ইটারটুলস ডক পৃষ্ঠা থেকে ।
তালিকা টুকরা ব্যবহার । বাক্য গঠনটি মূলতঃ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 of
1 , instead of the invalid list index of
1.5`):
>>> i[:len(i)//2]
[0, 1, 2]
.. এবং দ্বিতীয় অর্ধের জন্য মানগুলি অদলবদল করুন:
>>> i[len(i)//2:]
[3, 4, 5]
3//2
দেয় যাতে ফলাফল দেয় 1
, তারপরে আপনি i[:1]
যা পান যা দেয় [0]
এবং i[1:]
যা দেয়[1, 2]
আপনার যদি একটি বড় তালিকা থাকে তবে প্রতিটি অংশটি প্রয়োজন অনুযায়ী ফলন করার জন্য এরটুলগুলি ব্যবহার করা এবং একটি ফাংশন লিখতে ভাল :
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]
@ থেফোর্তে এবং @ বেড কনস্ট্যান্টিনাইডসকে ধন্যবাদ
উপরের উত্তরগুলি কম-বেশি সঠিক হলেও, আপনার অ্যারের আকারটি 2 দিয়ে বিভাজ্য না হলে আপনি সমস্যার মধ্যে পড়তে পারেন, ফলস্বরূপ a / 2
, বিজোড় হওয়া অজগর 3.0.০ এ ভাসমান এবং আপনি যদি পূর্ববর্তী সংস্করণে যান তবে from __future__ import division
আপনার স্ক্রিপ্টের শুরুতে নির্দিষ্ট করুন । আপনার কোডটির a // 2
"ফরওয়ার্ড" সামঞ্জস্যতা পেতে আপনি কোনও ক্ষেত্রেই পূর্ণসংখ্যা বিভাগে যাওয়াই ভাল ।
এটি অন্যান্য সমাধানগুলির মতো, তবে কিছুটা দ্রুত।
# Usage: split_half([1,2,3,4,5]) Result: ([1, 2], [3, 4, 5])
def split_half(a):
half = len(a) >> 1
return a[:half], a[half:]
#for python 3
A = [0,1,2,3,4,5]
l = len(A)/2
B = A[:int(l)]
C = A[int(l):]
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 ডলার সারি ব্যবহার করে দেখেছি এবং এটি দ্বিতীয় সেকেন্ডের মধ্যেই শেষ হয়।
শুধু আমার দুই সেন্ট।
ধন্যবাদ!