নিষ্পাপ পদ্ধতির
def transpose_finite_iterable(iterable):
return zip(*iterable) # `itertools.izip` for Python 2 users
(সম্ভাব্য অসীম) পুনরাবৃত্তের সীমাবদ্ধ পুনরাবৃত্তিযোগ্য (যেমন list
/ tuple
/ str
) এর মতো ক্রমগুলির জন্য সূক্ষ্মভাবে কাজ করে যা চিত্রিত করা যেতে পারে
| |a_00| |a_10| ... |a_n0| |
| |a_01| |a_11| ... |a_n1| |
| |... | |... | ... |... | |
| |a_0i| |a_1i| ... |a_ni| |
| |... | |... | ... |... | |
কোথায়
n in ℕ
,
a_ij
সাথে সঙ্গতিপূর্ণ j
এর -th উপাদান i
-th iterable,
এবং প্রয়োগের পরে transpose_finite_iterable
আমরা পেতে
| |a_00| |a_01| ... |a_0i| ... |
| |a_10| |a_11| ... |a_1i| ... |
| |... | |... | ... |... | ... |
| |a_n0| |a_n1| ... |a_ni| ... |
পাইথনের যেমন উদাহরণের উদাহরণ যেখানে a_ij == j
,n == 2
>>> from itertools import count
>>> iterable = [count(), count()]
>>> result = transpose_finite_iterable(iterable)
>>> next(result)
(0, 0)
>>> next(result)
(1, 1)
তবে আমরা transpose_finite_iterable
আবার আসল কাঠামোতে ফিরে আসতে পারি না iterable
কারণ result
সীমাবদ্ধ পুনরাবৃত্তির ( tuple
আমাদের ক্ষেত্রে) অসীম পুনরাবৃত্তিযোগ্য :
>>> transpose_finite_iterable(result)
... hangs ...
Traceback (most recent call last):
File "...", line 1, in ...
File "...", line 2, in transpose_finite_iterable
MemoryError
তাহলে আমরা এই মামলাটি কীভাবে মোকাবেলা করতে পারি?
... এবং এখানে আসে deque
itertools.tee
ফাংশনের ডক্সগুলি একবার দেখার পরে , পাইথন রেসিপি রয়েছে যা কিছু সংশোধন করে আমাদের ক্ষেত্রে সহায়তা করতে পারে
def transpose_finite_iterables(iterable):
iterator = iter(iterable)
try:
first_elements = next(iterator)
except StopIteration:
return ()
queues = [deque([element])
for element in first_elements]
def coordinate(queue):
while True:
if not queue:
try:
elements = next(iterator)
except StopIteration:
return
for sub_queue, element in zip(queues, elements):
sub_queue.append(element)
yield queue.popleft()
return tuple(map(coordinate, queues))
চেক করা যাক
>>> from itertools import count
>>> iterable = [count(), count()]
>>> result = transpose_finite_iterables(transpose_finite_iterable(iterable))
>>> result
(<generator object transpose_finite_iterables.<locals>.coordinate at ...>, <generator object transpose_finite_iterables.<locals>.coordinate at ...>)
>>> next(result[0])
0
>>> next(result[0])
1
সংশ্লেষণ
এখন আমরা iterables বেশী যার সসীম হয় iterables সঙ্গে কাজ করার জন্য সাধারণ ফাংশন নির্ধারণ করতে পারেন এবং অন্য বেশী ব্যবহার সম্ভাব্য অসীম functools.singledispatch
প্রসাধক মত
from collections import (abc,
deque)
from functools import singledispatch
@singledispatch
def transpose(object_):
"""
Transposes given object.
"""
raise TypeError('Unsupported object type: {type}.'
.format(type=type))
@transpose.register(abc.Iterable)
def transpose_finite_iterables(object_):
"""
Transposes given iterable of finite iterables.
"""
iterator = iter(object_)
try:
first_elements = next(iterator)
except StopIteration:
return ()
queues = [deque([element])
for element in first_elements]
def coordinate(queue):
while True:
if not queue:
try:
elements = next(iterator)
except StopIteration:
return
for sub_queue, element in zip(queues, elements):
sub_queue.append(element)
yield queue.popleft()
return tuple(map(coordinate, queues))
def transpose_finite_iterable(object_):
"""
Transposes given finite iterable of iterables.
"""
yield from zip(*object_)
try:
transpose.register(abc.Collection, transpose_finite_iterable)
except AttributeError:
# Python3.5-
transpose.register(abc.Mapping, transpose_finite_iterable)
transpose.register(abc.Sequence, transpose_finite_iterable)
transpose.register(abc.Set, transpose_finite_iterable)
সীমাবদ্ধ নন-খালি পুনরাবৃত্তির তুলনায় বাইনারি অপারেটরগুলির শ্রেণিতে এটি গণিতবিদগণ তার নিজস্ব বিপরীতমুখী হিসাবে গণ্য (গণিতবিদরা এই ধরণের ফাংশনগুলিকে "অন্তর্ভুক্তি" বলে ) মনে করেন।
singledispatch
আইএনগির বোনাস হিসাবে আমরা numpy
অ্যারেগুলি পরিচালনা করতে পারি
import numpy as np
...
transpose.register(np.ndarray, np.transpose)
এবং তারপরে এটি ব্যবহার করুন
>>> array = np.arange(4).reshape((2,2))
>>> array
array([[0, 1],
[2, 3]])
>>> transpose(array)
array([[0, 2],
[1, 3]])
বিঃদ্রঃ
যেহেতু transpose
আয় iterators এবং যদি কেউ একটি আছে চায় tuple
এর list
ওপি মত গুলি - এই সঙ্গে অতিরিক্ত তৈরি করা যেতে পারে map
বিল্ট-ইন ফাংশন মত
>>> original = [('a', 1), ('b', 2), ('c', 3), ('d', 4)]
>>> tuple(map(list, transpose(original)))
(['a', 'b', 'c', 'd'], [1, 2, 3, 4])
বিজ্ঞাপন
আমি সংস্করণ থেকে lz
প্যাকেজে সাধারণকরণ সমাধান যুক্ত করেছি 0.5.0
যা ব্যবহার করা যেতে পারে
>>> from lz.transposition import transpose
>>> list(map(tuple, transpose(zip(range(10), range(10, 20)))))
[(0, 1, 2, 3, 4, 5, 6, 7, 8, 9), (10, 11, 12, 13, 14, 15, 16, 17, 18, 19)]
পুনশ্চ
সম্ভাব্য অসীম পুনরাবৃত্তির সম্ভাব্য অসীম পুনরাবৃত্তিকে পরিচালনা করার জন্য কোনও সমাধান নেই (অন্তত সুস্পষ্ট) তবে এই ক্ষেত্রে যদিও কম দেখা যায় না।