Skip to content

Commit 5fbfbd1

Browse files
hsiangjenliDr-XYZ
andauthored
Translate/itertools (#1139)
* translate * translate * translate * translate * original * translate * Update library/itertools.po Co-authored-by: Dr.XYZ <dr.xyz.tw@gmail.com> * Update library/itertools.po Co-authored-by: Dr.XYZ <dr.xyz.tw@gmail.com> --------- Co-authored-by: Dr.XYZ <dr.xyz.tw@gmail.com>
1 parent 00e488b commit 5fbfbd1

File tree

1 file changed

+300
-1
lines changed

1 file changed

+300
-1
lines changed

library/itertools.po

Lines changed: 300 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1188,6 +1188,8 @@ msgid ""
11881188
"If the input is an iterator, then fully consuming the *islice* advances the "
11891189
"input iterator by ``max(start, stop)`` steps regardless of the *step* value."
11901190
msgstr ""
1191+
"若輸入為疊代器,則完整耗盡 *islice* 會使輸入的疊代器向前移動 ``max(start, "
1192+
"stop)`` 步,與 *step* 的值無關。"
11911193

11921194
#: ../../library/itertools.rst:513
11931195
msgid "Return successive overlapping pairs taken from the input *iterable*."
@@ -1332,6 +1334,8 @@ msgid ""
13321334
"`Cartesian product <https://en.wikipedia.org/wiki/Cartesian_product>`_ of "
13331335
"the input iterables."
13341336
msgstr ""
1337+
"輸入可疊代物的 `笛卡爾乘積 <https://en.wikipedia.org/wiki/"
1338+
"Cartesian_product>`_"
13351339

13361340
#: ../../library/itertools.rst:592
13371341
msgid ""
@@ -1601,10 +1605,14 @@ msgid ""
16011605
"`tee` calls to share the same underlying data chain and to have a single "
16021606
"update step rather than a chain of calls."
16031607
msgstr ""
1608+
"當輸入的 *iterable* 已經是一個 tee 疊代物件時,回傳的 tuple(元組)中所有成員"
1609+
"都會被建立,就如同它們是由上游的 :func:`tee` 呼叫所產生的一樣。這個「展平步"
1610+
"驟 (flattening step)」讓巢狀的 :func:`tee` 呼叫能共享相同的底層資料鏈,並以單"
1611+
"一的更新步驟取代一連串的呼叫。"
16041612

16051613
#: ../../library/itertools.rst:734
16061614
msgid "The flattening property makes tee iterators efficiently peekable:"
1607-
msgstr ""
1615+
msgstr "展平特性讓 tee 疊代器具備高效的預覽能力:"
16081616

16091617
#: ../../library/itertools.rst:736
16101618
msgid ""
@@ -1613,6 +1621,10 @@ msgid ""
16131621
" [forked_iterator] = tee(tee_iterator, 1)\n"
16141622
" return next(forked_iterator)"
16151623
msgstr ""
1624+
"def lookahead(tee_iterator):\n"
1625+
" \"回傳下一個值,但不推進輸入\"\n"
1626+
" [forked_iterator] = tee(tee_iterator, 1)\n"
1627+
" return next(forked_iterator)"
16161628

16171629
#: ../../library/itertools.rst:743
16181630
msgid ""
@@ -1969,6 +1981,171 @@ msgid ""
19691981
" while True:\n"
19701982
" yield function()"
19711983
msgstr ""
1984+
"from collections import Counter, deque\n"
1985+
"from contextlib import suppress\n"
1986+
"from functools import reduce\n"
1987+
"from math import comb, prod, sumprod, isqrt\n"
1988+
"from operator import itemgetter, getitem, mul, neg\n"
1989+
"\n"
1990+
"def take(n, iterable):\n"
1991+
" \"回傳可疊代物件的前 n 個元素為串列。\"\n"
1992+
" return list(islice(iterable, n))\n"
1993+
"\n"
1994+
"def prepend(value, iterable):\n"
1995+
" \"在可疊代物件開頭插入單一值。\"\n"
1996+
" # prepend(1, [2, 3, 4]) → 1 2 3 4\n"
1997+
" return chain([value], iterable)\n"
1998+
"\n"
1999+
"def tabulate(function, start=0):\n"
2000+
" \"回傳 function(0), function(1), ...\"\n"
2001+
" return map(function, count(start))\n"
2002+
"\n"
2003+
"def repeatfunc(function, times=None, *args):\n"
2004+
" \"重複呼叫一個帶指定引數的函式。\"\n"
2005+
" if times is None:\n"
2006+
" return starmap(function, repeat(args))\n"
2007+
" return starmap(function, repeat(args, times))\n"
2008+
"\n"
2009+
"def flatten(list_of_lists):\n"
2010+
" \"將巢狀結構攤平一層。\"\n"
2011+
" return chain.from_iterable(list_of_lists)\n"
2012+
"\n"
2013+
"def ncycles(iterable, n):\n"
2014+
" \"回傳序列的元素重複 n 次。\"\n"
2015+
" return chain.from_iterable(repeat(tuple(iterable), n))\n"
2016+
"\n"
2017+
"def loops(n):\n"
2018+
" \"執行 n 次的迴圈。類似 range(n) 但不建立整數序列。\"\n"
2019+
" # for _ in loops(100): ...\n"
2020+
" return repeat(None, n)\n"
2021+
"\n"
2022+
"def tail(n, iterable):\n"
2023+
" \"回傳一個疊代器,疊代最後 n 個元素。\"\n"
2024+
" # tail(3, 'ABCDEFG') → E F G\n"
2025+
" return iter(deque(iterable, maxlen=n))\n"
2026+
"\n"
2027+
"def consume(iterator, n=None):\n"
2028+
" \"將疊代器往前推進 n 步。如果 n 為 None,則完全消耗。\"\n"
2029+
" # 使用以 C 語言的速度消耗疊代器的函式。\n"
2030+
" if n is None:\n"
2031+
" deque(iterator, maxlen=0)\n"
2032+
" else:\n"
2033+
" next(islice(iterator, n, n), None)\n"
2034+
"\n"
2035+
"def nth(iterable, n, default=None):\n"
2036+
" \"回傳第 n 個元素或預設值。\"\n"
2037+
" return next(islice(iterable, n, None), default)\n"
2038+
"\n"
2039+
"def quantify(iterable, predicate=bool):\n"
2040+
" \"給定一個回傳 True 或 False 的判斷函式,計算為 True 的結果。\"\n"
2041+
" return sum(map(predicate, iterable))\n"
2042+
"\n"
2043+
"def first_true(iterable, default=False, predicate=None):\n"
2044+
" \"回傳第一個為 true 的值,若無則回傳*預設值*。\"\n"
2045+
" # first_true([a,b,c], x) → a or b or c or x\n"
2046+
" # first_true([a,b], x, f) → a if f(a) else b if f(b) else x\n"
2047+
" return next(filter(predicate, iterable), default)\n"
2048+
"\n"
2049+
"def all_equal(iterable, key=None):\n"
2050+
" \"回傳 True,如果所有元素兩兩相等。\"\n"
2051+
" # all_equal('4٤௪౪໔', key=int) → True\n"
2052+
" return len(take(2, groupby(iterable, key))) <= 1\n"
2053+
"\n"
2054+
"def unique_justseen(iterable, key=None):\n"
2055+
" \"產生唯一的元素,並保留原始順序。只記住剛看見的元素。\"\n"
2056+
" # unique_justseen('AAAABBBCCDAABBB') → A B C D A B\n"
2057+
" # unique_justseen('ABBcCAD', str.casefold) → A B c A D\n"
2058+
" if key is None:\n"
2059+
" return map(itemgetter(0), groupby(iterable))\n"
2060+
" return map(next, map(itemgetter(1), groupby(iterable, key)))\n"
2061+
"\n"
2062+
"def unique_everseen(iterable, key=None):\n"
2063+
" \"產生唯一的元素,並保留原始順序。記住所有曾見過的元素。\"\n"
2064+
" # unique_everseen('AAAABBBCCDAABBB') → A B C D\n"
2065+
" # unique_everseen('ABBcCAD', str.casefold) → A B c D\n"
2066+
" seen = set()\n"
2067+
" if key is None:\n"
2068+
" for element in filterfalse(seen.__contains__, iterable):\n"
2069+
" seen.add(element)\n"
2070+
" yield element\n"
2071+
" else:\n"
2072+
" for element in iterable:\n"
2073+
" k = key(element)\n"
2074+
" if k not in seen:\n"
2075+
" seen.add(k)\n"
2076+
" yield element\n"
2077+
"\n"
2078+
"def unique(iterable, key=None, reverse=False):\n"
2079+
" \"產生排序後的不重複元素。支援不可雜湊的輸入。\"\n"
2080+
" # unique([[1, 2], [3, 4], [1, 2]]) → [1, 2] [3, 4]\n"
2081+
" sequenced = sorted(iterable, key=key, reverse=reverse)\n"
2082+
" return unique_justseen(sequenced, key=key)\n"
2083+
"\n"
2084+
"def sliding_window(iterable, n):\n"
2085+
" \"將資料收集成重疊的固定長度區段或區塊。\"\n"
2086+
" # sliding_window('ABCDEFG', 4) → ABCD BCDE CDEF DEFG\n"
2087+
" iterator = iter(iterable)\n"
2088+
" window = deque(islice(iterator, n - 1), maxlen=n)\n"
2089+
" for x in iterator:\n"
2090+
" window.append(x)\n"
2091+
" yield tuple(window)\n"
2092+
"\n"
2093+
"def grouper(iterable, n, *, incomplete='fill', fillvalue=None):\n"
2094+
" \"將資料收集成不重疊的固定長度區段或區塊。\"\n"
2095+
" # grouper('ABCDEFG', 3, fillvalue='x') → ABC DEF Gxx\n"
2096+
" # grouper('ABCDEFG', 3, incomplete='strict') → ABC DEF ValueError\n"
2097+
" # grouper('ABCDEFG', 3, incomplete='ignore') → ABC DEF\n"
2098+
" iterators = [iter(iterable)] * n\n"
2099+
" match incomplete:\n"
2100+
" case 'fill':\n"
2101+
" return zip_longest(*iterators, fillvalue=fillvalue)\n"
2102+
" case 'strict':\n"
2103+
" return zip(*iterators, strict=True)\n"
2104+
" case 'ignore':\n"
2105+
" return zip(*iterators)\n"
2106+
" case _:\n"
2107+
" raise ValueError('Expected fill, strict, or ignore')\n"
2108+
"\n"
2109+
"def roundrobin(*iterables):\n"
2110+
" \"以循環方式依序輸入可疊代物件,直到全部耗盡。\"\n"
2111+
" # roundrobin('ABC', 'D', 'EF') → A D E B F C\n"
2112+
" # 演算法出自 George Sakkis\n"
2113+
" iterators = map(iter, iterables)\n"
2114+
" for num_active in range(len(iterables), 0, -1):\n"
2115+
" iterators = cycle(islice(iterators, num_active))\n"
2116+
" yield from map(next, iterators)\n"
2117+
"\n"
2118+
"def subslices(seq):\n"
2119+
" \"回傳序列的所有連續非空子切片。\"\n"
2120+
" # subslices('ABCD') → A AB ABC ABCD B BC BCD C CD D\n"
2121+
" slices = starmap(slice, combinations(range(len(seq) + 1), 2))\n"
2122+
" return map(getitem, repeat(seq), slices)\n"
2123+
"\n"
2124+
"def iter_index(iterable, value, start=0, stop=None):\n"
2125+
" \"回傳在序列或可疊代物件中某值出現的索引位置。\"\n"
2126+
" # iter_index('AABCADEAF', 'A') → 0 1 4 7\n"
2127+
" seq_index = getattr(iterable, 'index', None)\n"
2128+
" if seq_index is None:\n"
2129+
" iterator = islice(iterable, start, stop)\n"
2130+
" for i, element in enumerate(iterator, start):\n"
2131+
" if element is value or element == value:\n"
2132+
" yield i\n"
2133+
" else:\n"
2134+
" stop = len(iterable) if stop is None else stop\n"
2135+
" i = start\n"
2136+
" with suppress(ValueError):\n"
2137+
" while True:\n"
2138+
" yield (i := seq_index(value, i, stop))\n"
2139+
" i += 1\n"
2140+
"\n"
2141+
"def iter_except(function, exception, first=None):\n"
2142+
" \"將一個 call-until-exception 轉換為疊代器介面。\"\n"
2143+
" # iter_except(d.popitem, KeyError) → 非阻塞的字典疊代器\n"
2144+
" with suppress(exception):\n"
2145+
" if first is not None:\n"
2146+
" yield first()\n"
2147+
" while True:\n"
2148+
" yield function()"
19722149

19732150
#: ../../library/itertools.rst:1008
19742151
msgid "The following recipes have a more mathematical flavor:"
@@ -2100,3 +2277,125 @@ msgid ""
21002277
" n -= n // prime\n"
21012278
" return n"
21022279
msgstr ""
2280+
"def multinomial(*counts):\n"
2281+
" \"多重集合的不同排列數。\"\n"
2282+
" # Counter('abracadabra').values() → 5 2 2 1 1\n"
2283+
" # multinomial(5, 2, 2, 1, 1) → 83160\n"
2284+
" return prod(map(comb, accumulate(counts), counts))\n"
2285+
"\n"
2286+
"def powerset(iterable):\n"
2287+
" \"來自可疊代物件的子序列,從最短到最長。\"\n"
2288+
" # powerset([1,2,3]) → () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)\n"
2289+
" s = list(iterable)\n"
2290+
" return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))\n"
2291+
"\n"
2292+
"def sum_of_squares(iterable):\n"
2293+
" \"將輸入值的平方加總。\"\n"
2294+
" # sum_of_squares([10, 20, 30]) → 1400\n"
2295+
" return sumprod(*tee(iterable))\n"
2296+
"\n"
2297+
"def reshape(matrix, columns):\n"
2298+
" \"將 2 維矩陣重新塑形為指定的行數。\"\n"
2299+
" # reshape([(0, 1), (2, 3), (4, 5)], 3) → (0, 1, 2), (3, 4, 5)\n"
2300+
" return batched(chain.from_iterable(matrix), columns, strict=True)\n"
2301+
"\n"
2302+
"def transpose(matrix):\n"
2303+
" \"交換 2 維矩陣的列和行。\"\n"
2304+
" # transpose([(1, 2, 3), (11, 22, 33)]) → (1, 11) (2, 22) (3, 33)\n"
2305+
" return zip(*matrix, strict=True)\n"
2306+
"\n"
2307+
"def matmul(m1, m2):\n"
2308+
" \"矩陣相乘。\"\n"
2309+
" # matmul([(7, 5), (3, 5)], [(2, 5), (7, 9)]) → (49, 80), (41, 60)\n"
2310+
" n = len(m2[0])\n"
2311+
" return batched(starmap(sumprod, product(m1, transpose(m2))), n)\n"
2312+
"\n"
2313+
"def convolve(signal, kernel):\n"
2314+
" \"\"\"兩個可疊代物件的離散線性捲積。\n"
2315+
" 等同於多項式相乘。\n"
2316+
"\n"
2317+
" 在數學上捲積是可交換的;但輸入的處理方式不同。\n"
2318+
" 訊號以惰性方式被讀取,且可以是無限;核心會在計算開始前被全部讀取。\n"
2319+
"\n"
2320+
" 文章:https://betterexplained.com/articles/intuitive-convolution/\n"
2321+
" 影片:https://www.youtube.com/watch?v=KuXjwB4LzSA\n"
2322+
" \"\"\"\n"
2323+
" # convolve([1, -1, -20], [1, -3]) → 1 -4 -17 60\n"
2324+
" # convolve(data, [0.25, 0.25, 0.25, 0.25]) → 移動平均(模糊)\n"
2325+
" # convolve(data, [1/2, 0, -1/2]) → 一階導數估計\n"
2326+
" # convolve(data, [1, -2, 1]) → 二階導數估計\n"
2327+
" kernel = tuple(kernel)[::-1]\n"
2328+
" n = len(kernel)\n"
2329+
" padded_signal = chain(repeat(0, n-1), signal, repeat(0, n-1))\n"
2330+
" windowed_signal = sliding_window(padded_signal, n)\n"
2331+
" return map(sumprod, repeat(kernel), windowed_signal)\n"
2332+
"\n"
2333+
"def polynomial_from_roots(roots):\n"
2334+
" \"\"\"由多項式的根計算其係數。\n"
2335+
"\n"
2336+
" (x - 5) (x + 4) (x - 3) 展開為: x³ -4x² -17x + 60\n"
2337+
" \"\"\"\n"
2338+
" # polynomial_from_roots([5, -4, 3]) → [1, -4, -17, 60]\n"
2339+
" factors = zip(repeat(1), map(neg, roots))\n"
2340+
" return list(reduce(convolve, factors, [1]))\n"
2341+
"\n"
2342+
"def polynomial_eval(coefficients, x):\n"
2343+
" \"\"\"在指定值計算多項式的值。\n"
2344+
"\n"
2345+
" 此方法在數值穩定性上比 Horner 方法更好。\n"
2346+
" \"\"\"\n"
2347+
" # 計算 x³ -4x² -17x + 60 在 x = 5 時的值\n"
2348+
" # polynomial_eval([1, -4, -17, 60], x=5) → 0\n"
2349+
" n = len(coefficients)\n"
2350+
" if not n:\n"
2351+
" return type(x)(0)\n"
2352+
" powers = map(pow, repeat(x), reversed(range(n)))\n"
2353+
" return sumprod(coefficients, powers)\n"
2354+
"\n"
2355+
"def polynomial_derivative(coefficients):\n"
2356+
" \"\"\"計算多項式的一階導數。\n"
2357+
"\n"
2358+
" f(x) = x³ -4x² -17x + 60\n"
2359+
" f'(x) = 3x² -8x -17\n"
2360+
" \"\"\"\n"
2361+
" # polynomial_derivative([1, -4, -17, 60]) → [3, -8, -17]\n"
2362+
" n = len(coefficients)\n"
2363+
" powers = reversed(range(1, n))\n"
2364+
" return list(map(mul, coefficients, powers))\n"
2365+
"\n"
2366+
"def sieve(n):\n"
2367+
" \"小於 n 的質數。\"\n"
2368+
" # sieve(30) → 2 3 5 7 11 13 17 19 23 29\n"
2369+
" if n > 2:\n"
2370+
" yield 2\n"
2371+
" data = bytearray((0, 1)) * (n // 2)\n"
2372+
" for p in iter_index(data, 1, start=3, stop=isqrt(n) + 1):\n"
2373+
" data[p*p : n : p+p] = bytes(len(range(p*p, n, p+p)))\n"
2374+
" yield from iter_index(data, 1, start=3)\n"
2375+
"\n"
2376+
"def factor(n):\n"
2377+
" \"n 的質因數。\"\n"
2378+
" # factor(99) → 3 3 11\n"
2379+
" # factor(1_000_000_000_000_007) → 47 59 360620266859\n"
2380+
" # factor(1_000_000_000_000_403) → 1000000000000403\n"
2381+
" for prime in sieve(isqrt(n) + 1):\n"
2382+
" while not n % prime:\n"
2383+
" yield prime\n"
2384+
" n //= prime\n"
2385+
" if n == 1:\n"
2386+
" return\n"
2387+
" if n > 1:\n"
2388+
" yield n\n"
2389+
"\n"
2390+
"def is_prime(n):\n"
2391+
" \"回傳 True,若 n 為質數。\"\n"
2392+
" # is_prime(1_000_000_000_000_403) → True\n"
2393+
" return n > 1 and next(factor(n)) == n\n"
2394+
"\n"
2395+
"def totient(n):\n"
2396+
" \"計算不大於 n 且與 n 互質的自然數個數。\"\n"
2397+
" # https://mathworld.wolfram.com/TotientFunction.html\n"
2398+
" # totient(12) → 4 因爲 len([1, 5, 7, 11]) == 4\n"
2399+
" for prime in set(factor(n)):\n"
2400+
" n -= n // prime\n"
2401+
" return n"

0 commit comments

Comments
 (0)