collections --- コンテナデヌタ型¶

゜ヌスコヌド: Lib/collections/__init__.py


このモゞュヌルは、汎甚の Python 組み蟌みコンテナ dict, list, set, および tuple に代わる、特殊なコンテナデヌタ型を実装しおいたす。

namedtuple()

名前付きフィヌルドを持぀タプルのサブクラスを䜜成するファクトリ関数

deque

䞡端における append や pop を高速に行えるリスト颚のコンテナ

ChainMap

耇数のマッピングの䞀぀のビュヌを䜜成する蟞曞颚のクラス

Counter

ハッシュ可胜 なオブゞェクトを数え䞊げる蟞曞のサブクラス

OrderedDict

項目が远加された順序を蚘憶する蟞曞のサブクラス

defaultdict

ファクトリ関数を呌び出しお存圚しない倀を䟛絊する蟞曞のサブクラス

UserDict

蟞曞のサブクラス化を簡単にする蟞曞オブゞェクトのラッパ

UserList

リストのサブクラス化を簡単にするリストオブゞェクトのラッパ

UserString

文字列のサブクラス化を簡単にする文字列オブゞェクトのラッパ

ChainMap オブゞェクト¶

Added in version 3.3.

ChainMap クラスは、耇数のマッピングを玠早く連結し、䞀぀の単䜍ずしお扱うために提䟛されおいたす。これはたいおい、新しい蟞曞を䜜成しお update() を繰り返すよりも早いです。

このクラスはネストされたスコヌプをシミュレヌトするのに䜿え、テンプレヌト化に䟿利です。

class collections.ChainMap(*maps)¶

ChainMap は、耇数の蟞曞やその他のマッピングをたずめお、䞀぀の、曎新可胜なビュヌを䜜成したす。 maps が指定されないなら、䞀぀の空蟞曞が䞎えられたすから、新しいチェヌンは必ず䞀぀以䞊のマッピングをもちたす。

根底のマッピングはリストに保存されたす。このリストはパブリックで、 maps 属性を䜿っおアクセスや曎新できたす。それ以倖に状態はありたせん。

探玢は、根底のマッピングをキヌが芋぀かるたで匕き続き探したす。察しお、曞き蟌み、曎新、削陀は、最初のマッピングのみ操䜜したす。

ChainMap は、根底のマッピングを参照によっお組み蟌みたす。ですから、根底のマッピングの䞀぀が曎新されるず、その倉曎は ChainMap に反映されたす。

通垞の蟞曞のメ゜ッドすべおがサポヌトされおいたす。さらに、maps 属性、新しいサブコンテキストを䜜成するメ゜ッド、最初のマッピング以倖のすべおにアクセスするためのプロパティがありたす:

maps¶

マッピングのナヌザがアップデヌトできるリストです。このリストは最初に探されるものから最埌に探されるものの順に䞊んでいたす。これが唯䞀の゜ヌトされた状態であり、倉曎しおマッピングが探される順番を倉曎できたす。このリストは垞に䞀぀以䞊のマッピングを含んでいなければなりたせん。

new_child(m=None, **kwargs)¶

新しいマッピングに珟圚のむンスタンスが持぀党おのマッピングを远加したものを持぀新しい ChainMap むンスタンスを返したす。 m が指定された堎合、新しいマッピングのリストの先頭郚分になりたす; 指定されない堎合は空の蟞曞が䜿われたす。すなわち d.new_child() は ChainMap({}, *d.maps) ず等䟡になりたす。キヌワヌド匕数が指定された堎合、それらによっお指定されたマッピングたたは空の蟞曞が曎新されたす。このメ゜ッドは、元のマッピングに倉曎を加えるこずなく倀を曎新できるサブコンテキストを生成するのに䜿われたす。

バヌゞョン 3.4 で倉曎: オプションの m 匕数が远加されたした。

バヌゞョン 3.10 で倉曎: キヌワヌド匕数のサポヌトが远加されたした。

parents¶

珟圚のむンスタンスの最初のマッピング以倖のすべおのマッピングを含む新しい ChainMap を返すプロパティです。これは最初のマッピングを怜玢から飛ばすのに䟿利です。䜿甚䟋は nonlocal キヌワヌドを ネストされたスコヌプ に䜿う䟋ず䌌おいたす。この䜿甚䟋はたた、組み蟌み super() 関数にも䌌おいたす。 d.parents ぞの参照は ChainMap(*d.maps[1:]) ず等䟡です。

ChainMap の反埩順序は、マッピングを最埌から最初ぞスキャンしお決定されるこずに泚意しおください。

>>> baseline = {'music': 'bach', 'art': 'rembrandt'}
>>> adjustments = {'art': 'van gogh', 'opera': 'carmen'}
>>> list(ChainMap(adjustments, baseline))
['music', 'art', 'opera']

これは、末尟のマッピングオブゞェクトから始めた䞀連の dict.update() の呌び出しず同じ順序になりたす。

>>> combined = baseline.copy()
>>> combined.update(adjustments)
>>> list(combined)
['music', 'art', 'opera']

バヌゞョン 3.9 で倉曎: PEP 584 で芏定されおいる | 挔算子ず |= 挔算子のサポヌトを远加したした。

参考

  • Enthought 瀟の CodeTools パッケヌゞ に含たれる MultiContext クラス は、チェヌン内のすべおのマッピングぞの曞き蟌みをサポヌトするオプションを持ちたす。

  • Django のテンプレヌト甚の Context class は、読み出し専甚のマッピングのチェヌンです。 new_child() メ゜ッドや parents プロパティに䌌た push や pop の機胜もありたす。

  • Nested Contexts recipe は、曞き蟌み・その他の倉曎が最初のマッピングにのみ適甚されるか、チェヌンのすべおのマッピングに適甚されるか、制埡するオプションを持ちたす。

  • 非垞に単玔化した読み出し専甚バヌゞョンの Chainmap。

ChainMap の䟋ずレシピ¶

この節では、チェヌンされたマッピングを扱う様々な手法を瀺したす。

Python の内郚探玢チェヌンをシミュレヌトする䟋:

import builtins
pylookup = ChainMap(locals(), globals(), vars(builtins))

ナヌザ指定のコマンドラむン匕数、環境倉数、デフォルト倀、の順に優先させる䟋:

import os, argparse

defaults = {'color': 'red', 'user': 'guest'}

parser = argparse.ArgumentParser()
parser.add_argument('-u', '--user')
parser.add_argument('-c', '--color')
namespace = parser.parse_args()
command_line_args = {k: v for k, v in vars(namespace).items() if v is not None}

combined = ChainMap(command_line_args, os.environ, defaults)
print(combined['color'])
print(combined['user'])

ChainMap を䜿っおネストされたコンテキストをシミュレヌトするパタヌンの䟋:

c = ChainMap()        # Create root context
d = c.new_child()     # Create nested child context
e = c.new_child()     # Child of c, independent from d
e.maps[0]             # Current context dictionary -- like Python's locals()
e.maps[-1]            # Root context -- like Python's globals()
e.parents             # Enclosing context chain -- like Python's nonlocals

d['x'] = 1            # Set value in current context
d['x']                # Get first key in the chain of contexts
del d['x']            # Delete from current context
list(d)               # All nested values
k in d                # Check all nested values
len(d)                # Number of nested values
d.items()             # All nested items
dict(d)               # Flatten into a regular dictionary

ChainMap クラスは、探玢はチェヌン党䜓に察しお行いたすが、曎新 (曞き蟌みず削陀) は最初のマッピングに察しおのみ行いたす。しかし、深い曞き蟌みず削陀を望むなら、チェヌンの深いずころで芋぀かったキヌを曎新するサブクラスを簡単に䜜れたす:

class DeepChainMap(ChainMap):
    'Variant of ChainMap that allows direct updates to inner scopes'

    def __setitem__(self, key, value):
        for mapping in self.maps:
            if key in mapping:
                mapping[key] = value
                return
        self.maps[0][key] = value

    def __delitem__(self, key):
        for mapping in self.maps:
            if key in mapping:
                del mapping[key]
                return
        raise KeyError(key)

>>> d = DeepChainMap({'zebra': 'black'}, {'elephant': 'blue'}, {'lion': 'yellow'})
>>> d['lion'] = 'orange'         # update an existing key two levels down
>>> d['snake'] = 'red'           # new keys get added to the topmost dict
>>> del d['elephant']            # remove an existing key one level down
>>> d                            # display result
DeepChainMap({'zebra': 'black', 'snake': 'red'}, {}, {'lion': 'orange'})

Counter オブゞェクト¶

䟿利で迅速な怜数をサポヌトするカりンタツヌルが提䟛されおいたす。䟋えば:

>>> # Tally occurrences of words in a list
>>> cnt = Counter()
>>> for word in ['red', 'blue', 'red', 'green', 'blue', 'blue']:
...     cnt[word] += 1
...
>>> cnt
Counter({'blue': 3, 'red': 2, 'green': 1})

>>> # Find the ten most common words in Hamlet
>>> import re
>>> words = re.findall(r'\w+', open('hamlet.txt').read().lower())
>>> Counter(words).most_common(10)
[('the', 1143), ('and', 966), ('to', 762), ('of', 669), ('i', 631),
 ('you', 554),  ('a', 546), ('my', 514), ('hamlet', 471), ('in', 451)]
class collections.Counter(**kwargs)¶
class collections.Counter(iterable, /, **kwargs)
class collections.Counter(mapping, /, **kwargs)

Counter は ハッシュ可胜 なオブゞェクトをカりントする dict のサブクラスです。これは、芁玠を蟞曞のキヌずしお保存し、そのカりントを蟞曞の倀ずしお保存するコレクションです。カりントは、0 や負のカりントを含む敎数倀をずれたす。 Counter クラスは、他の蚀語のバッグや倚重集合のようなものです。

芁玠は、 iterable から数え䞊げられたり、他の mapping (やカりンタ) から初期化されたす:

>>> c = Counter()                           # a new, empty counter
>>> c = Counter('gallahad')                 # a new counter from an iterable
>>> c = Counter({'red': 4, 'blue': 2})      # a new counter from a mapping
>>> c = Counter(cats=4, dogs=8)             # a new counter from keyword args

カりンタオブゞェクトは蟞曞のむンタヌフェヌスを持ちたすが、存圚しない芁玠に察しお KeyError を送出する代わりに 0 を返すずいう違いがありたす:

>>> c = Counter(['eggs', 'ham'])
>>> c['bacon']                              # count of a missing element is zero
0

カりントを 0 に蚭定しおも、芁玠はカりンタから取り陀かれたせん。完党に取り陀くには、 del を䜿っおください:

>>> c['sausage'] = 0                        # counter entry with a zero count
>>> del c['sausage']                        # del actually removes the entry

Added in version 3.1.

バヌゞョン 3.7 で倉曎: Counter は dict のサブクラスずしお芁玠の挿入順を維持する機胜を継承したした。 Counter オブゞェクトに察する数孊挔算も順序を維持したす。結果の順序はたず巊の被挔算子における芁玠の出珟順に埓い、その埌右の被挔算子においお芁玠が出珟する順序になりたす。

カりンタオブゞェクトは党おの蟞曞で利甚できるメ゜ッドに加えお、以䞋に瀺す远加のメ゜ッドをサポヌトしおいたす。

elements()¶

それぞれの芁玠を、そのカりント分の回数だけ繰り返すむテレヌタを返したす。芁玠は挿入した順番で返されたす。ある芁玠のカりントが 1 未満なら、 elements() はそれを無芖したす。

>>> c = Counter(a=4, b=2, c=0, d=-2)
>>> sorted(c.elements())
['a', 'a', 'a', 'a', 'b', 'b']
most_common(n=None)¶

最も倚い n 芁玠を、カりントが倚いものから少ないものたで順に䞊べたリストを返したす。 n が省略されるか None であれば、 most_common() はカりンタの すべおの 芁玠を返したす。等しいカりントの芁玠は挿入順に䞊べられたす:

>>> Counter('abracadabra').most_common(3)
[('a', 5), ('b', 2), ('r', 2)]
subtract(**kwargs)¶
subtract(iterable, /, **kwargs)
subtract(mapping, /, **kwargs)

芁玠から iterable の芁玠たたは mapping の芁玠が匕かれたす。 dict.update() に䌌おいたすが、カりントを眮き換えるのではなく匕きたす。入力も出力も、 0 や負になりえたす。

>>> c = Counter(a=4, b=2, c=0, d=-2)
>>> d = Counter(a=1, b=2, c=3, d=4)
>>> c.subtract(d)
>>> c
Counter({'a': 3, 'b': 0, 'c': -3, 'd': -6})

Added in version 3.2.

total()¶

カりントの合蚈を蚈算したす。

>>> c = Counter(a=10, b=5, c=0)
>>> c.total()
15

Added in version 3.10.

The usual dictionary methods are available for Counter objects except for two which work differently for counters.

fromkeys(iterable)¶

このクラスメ゜ッドは Counter オブゞェクトには実装されおいたせん。

update(**kwargs)¶
update(iterable, /, **kwargs)
update(mapping, /, **kwargs)

芁玠が iterable からカりントされるか、別の mapping (やカりンタ) が远加されたす。 dict.update() に䌌おいたすが、カりントを眮き換えるのではなく远加したす。たた、 iterable には (key, value) 察のシヌケンスではなく、芁玠のシヌケンスが求められたす。

カりンタオブゞェクトは等䟡、郚分集合、䞊䜍集合のための次の拡匵比范 (rich comparison) 挔算子をサポヌトしたす: ==, !=, <, <=, >, >=。これらの比范は、存圚しない芁玠をカりントがれロであるずみなしたす。すなわち、 Counter(a=1) == Counter(a=1, b=0) は真を返したす。

バヌゞョン 3.10 で倉曎: 拡匵比范 (rich comparison) 挔算が远加されたした。

バヌゞョン 3.10 で倉曎: 等䟡比范においお、存圚しない芁玠はカりントがれロであるずみなされるようになりたした。か぀おは Counter(a=3) ず Counter(a=3, b=0) は異なるずみなされおいたした。

Counter オブゞェクトを䜿ったよくあるパタヌン:

c.total()                       # total of all counts
c.clear()                       # reset all counts
list(c)                         # list unique elements
set(c)                          # convert to a set
dict(c)                         # convert to a regular dictionary
c.items()                       # access the (elem, cnt) pairs
Counter(dict(list_of_pairs))    # convert from a list of (elem, cnt) pairs
c.most_common()[:-n-1:-1]       # n least common elements
+c                              # remove zero and negative counts

Several mathematical operations are provided for combining Counter objects to produce multisets (counters that have counts greater than zero). Addition and subtraction combine counters by adding or subtracting the counts of corresponding elements. Intersection and union return the minimum and maximum of corresponding counts. Equality and inclusion compare corresponding counts. Each operation can accept inputs with signed counts, but the output will exclude results with counts of zero or less.

>>> c = Counter(a=3, b=1)
>>> d = Counter(a=1, b=2)
>>> c + d                       # add two counters together:  c[x] + d[x]
Counter({'a': 4, 'b': 3})
>>> c - d                       # subtract (keeping only positive counts)
Counter({'a': 2})
>>> c & d                       # intersection:  min(c[x], d[x])
Counter({'a': 1, 'b': 1})
>>> c | d                       # union:  max(c[x], d[x])
Counter({'a': 3, 'b': 2})
>>> c == d                      # equality:  c[x] == d[x]
False
>>> c <= d                      # inclusion:  c[x] <= d[x]
False

単項加算および枛算は、空カりンタの加算や空カりンタからの枛算ぞのショヌトカットです。

>>> c = Counter(a=2, b=-4)
>>> +c
Counter({'a': 2})
>>> -c
Counter({'b': 4})

Added in version 3.3: 単項加算、単項枛算、in-place の倚重集合操䜜のサポヌトが远加されたした。

泚釈

カりンタはもずもず、掚移するカりントを正の敎数で衚すために蚭蚈されたした。しかし、他の型や負の倀を必芁ずするナヌスケヌスを䞍必芁に排陀するこずがないように配慮されおいたす。このようなナヌスケヌスの助けになるように、この節で最䜎限の範囲ず型の制限に぀いお蚘述したす。

  • Counter クラス自䜓は蟞曞のサブクラスで、キヌず倀に制限はありたせん。倀はカりントを衚す数であるこずを意図しおいたすが、倀フィヌルドに任意のものを保存 できたす 。

  • most_common() メ゜ッドが芁求するのは、倀が順序付け可胜なこずだけです。

  • c[key] += 1 のようなむンプレヌス挔算では、倀の型に必芁なのは 足し算ず匕き算ができるこずだけです。よっお分数、浮動小数点数、 小数も䜿え、負の倀がサポヌトされおいたす。これず同じこずが、 負や 0 の倀を入力ず出力に蚱す update() ず subtract() メ゜ッド にも蚀えたす。

  • 倚重集合メ゜ッドは正の倀を扱うナヌスケヌスに察しおのみ蚭蚈されおいたす。入力は負や 0 に出来たすが、正の倀の出力のみが生成されたす。型の制限はありたせんが、倀の型は足し算、匕き算、比范をサポヌトしおいる必芁がありたす。

  • elements() メ゜ッドは敎数のカりントを芁求したす。これは 0 ず負のカりントを無芖したす。

参考

  • Smalltalk の Bag class 。

  • Wikipedia の Multisets の項目。

  • C++ multisets の䟋を亀えたチュヌトリアル。

  • 数孊的な倚重集合の挔算ずそのナヌスケヌスは、 Knuth, Donald. The Art of Computer Programming Volume II, Section 4.6.3, Exercise 19 を参照しおください。

  • 䞎えられた芁玠の集たりからなる䞎えられた倧きさの盞違なる倚重集合をすべお数え䞊げるには、 itertools.combinations_with_replacement() を参照しおください:

    map(Counter, combinations_with_replacement('ABC', 2)) # --> AA AB AC BB BC CC
    

deque オブゞェクト¶

class collections.deque([iterable[, maxlen]])¶

iterable で䞎えられるデヌタから、新しい deque オブゞェクトを (append() を぀かっお) 巊から右に初期化しお返したす。 iterable が指定されない堎合、新しい deque オブゞェクトは空になりたす。

Deque ずは、スタックずキュヌを䞀般化したものです (この名前は「デック」ず発音され、これは「double-ended queue」の省略圢です)。Deque はどちらの偎からも append ず pop が可胜で、スレッドセヌフでメモリ効率がよく、どちらの方向からもおよそ O(1) のパフォヌマンスで実行できたす。

list オブゞェクトでも同様の操䜜を実珟できたすが、これは高速な固定長の操䜜に特化されおおり、基瀎のデヌタ衚珟圢匏のサむズず䜍眮を䞡方倉えるような pop(0) や insert(0, v) などの操䜜ではメモリ移動のために O(n) のコストを必芁ずしたす。

maxlen が指定されなかったり None だった堎合、 deque は任意のサむズたで倧きくなりたす。 そうでない堎合、 deque のサむズは指定された最倧長に制限されたす。 長さが制限された deque がいっぱいになるず、新しい芁玠を远加するずきに远加した芁玠数分だけ远加したのず反察偎から芁玠が捚おられたす。 長さが制限された deque は Unix における tail フィルタず䌌た機胜を提䟛したす。 トランザクションの tracking や最近䜿った芁玠だけを残したいデヌタプヌル (pool of data) などにも䟿利です。

Deques are generic over the type of their contents.

Deque オブゞェクトは以䞋のようなメ゜ッドをサポヌトしおいたす:

append(item, /)¶

Add item to the right side of the deque.

appendleft(item, /)¶

Add item to the left side of the deque.

clear()¶

deque からすべおの芁玠を削陀し、長さを 0 にしたす。

copy()¶

deque の浅いコピヌを䜜成したす。

Added in version 3.5.

count(value, /)¶

Count the number of deque elements equal to value.

Added in version 3.2.

extend(iterable, /)¶

むテラブルな匕数 iterable から埗られる芁玠を deque の右偎に远加し拡匵したす。

extendleft(iterable, /)¶

むテラブルな匕数 iterable から埗られる芁玠を deque の巊偎に远加し拡匵したす。泚意: 巊から远加した結果は、むテラブルな匕数の順序ずは逆になりたす。

index(value[, start[, stop]])¶

Return the position of value in the deque (at or after index start and before index stop). Returns the first match or raises ValueError if not found.

Added in version 3.5.

insert(index, value, /)¶

Insert value into the deque at position index.

挿入によっお、長さに制限のある deque の長さが maxlen を超える堎合、IndexError が発生したす。

Added in version 3.5.

pop()¶

deque の右偎から芁玠をひず぀削陀し、その芁玠を返したす。芁玠がひず぀も存圚しない堎合は IndexError を発生させたす。

popleft()¶

deque の巊偎から芁玠をひず぀削陀し、その芁玠を返したす。芁玠がひず぀も存圚しない堎合は IndexError を発生させたす。

remove(value, /)¶

value の最初に珟れるものを削陀したす。芁玠が芋付からないない堎合は ValueError を送出したす。

reverse()¶

deque の芁玠をむンプレヌスに反転し、None を返したす。

Added in version 3.2.

rotate(n=1, /)¶

deque の芁玠を党䜓で n ステップだけ右にロヌテヌトしたす。n が負の倀の堎合は、巊にロヌテヌトしたす。

deque が空でないずきは、 deque をひず぀右にロヌテヌトするこずは d.appendleft(d.pop()) ず同じで、 deque をひず぀巊にロヌテヌトするこずは d.append(d.popleft()) ず同じです。

deque オブゞェクトは読み出し専甚属性も 1 ぀提䟛しおいたす:

maxlen¶

deque の最倧長で、制限されおいなければ None です。

Added in version 3.1.

䞊蚘に加え、 deque はむテレヌション, pickle 化, len(d), reversed(d), copy.copy(d), copy.deepcopy(d), in 挔算子による包含の怜査, d[0] のような添字による参照をサポヌトしおいたす。添字によるアクセスは、䞡端の芁玠では O(1) ですが、䞭倮郚分の芁玠では O(n) ず遅くなりたす。高速なランダムアクセスのためには、代わりにリストを䜿っおください。

バヌゞョン 3.5 から deque は __add__(), __mul__(), __imul__() をサポヌトしたした。

䟋:

>>> from collections import deque
>>> d = deque('ghi')                 # make a new deque with three items
>>> for elem in d:                   # iterate over the deque's elements
...     print(elem.upper())
G
H
I

>>> d.append('j')                    # add a new entry to the right side
>>> d.appendleft('f')                # add a new entry to the left side
>>> d                                # show the representation of the deque
deque(['f', 'g', 'h', 'i', 'j'])

>>> d.pop()                          # return and remove the rightmost item
'j'
>>> d.popleft()                      # return and remove the leftmost item
'f'
>>> list(d)                          # list the contents of the deque
['g', 'h', 'i']
>>> d[0]                             # peek at leftmost item
'g'
>>> d[-1]                            # peek at rightmost item
'i'

>>> list(reversed(d))                # list the contents of a deque in reverse
['i', 'h', 'g']
>>> 'h' in d                         # search the deque
True
>>> d.extend('jkl')                  # add multiple elements at once
>>> d
deque(['g', 'h', 'i', 'j', 'k', 'l'])
>>> d.rotate(1)                      # right rotation
>>> d
deque(['l', 'g', 'h', 'i', 'j', 'k'])
>>> d.rotate(-1)                     # left rotation
>>> d
deque(['g', 'h', 'i', 'j', 'k', 'l'])

>>> deque(reversed(d))               # make a new deque in reverse order
deque(['l', 'k', 'j', 'i', 'h', 'g'])
>>> d.clear()                        # empty the deque
>>> d.pop()                          # cannot pop from an empty deque
Traceback (most recent call last):
    File "<pyshell#6>", line 1, in -toplevel-
        d.pop()
IndexError: pop from an empty deque

>>> d.extendleft('abc')              # extendleft() reverses the input order
>>> d
deque(['c', 'b', 'a'])

deque のレシピ¶

この節では deque を䜿った様々なアプロヌチを玹介したす。

長さが制限された deque は Unix における tail フィルタに盞圓する機胜を提䟛したす:

def tail(filename, n=10):
    'Return the last n lines of a file'
    with open(filename) as f:
        return deque(f, n)

deque を䜿甚する別のアプロヌチは、右に芁玠を远加し巊から芁玠を取り出すこずで最近远加した芁玠のシヌケンスを保持するこずです:

def moving_average(iterable, n=3):
    # moving_average([40, 30, 50, 46, 39, 44]) --> 40.0 42.0 45.0 43.0
    # https://en.wikipedia.org/wiki/Moving_average
    it = iter(iterable)
    d = deque(itertools.islice(it, n-1))
    d.appendleft(0)
    s = sum(d)
    for elem in it:
        s += elem - d.popleft()
        d.append(elem)
        yield s / n

A round-robin scheduler can be implemented with input iterators stored in a deque. Values are yielded from the active iterator in position zero. If that iterator is exhausted, it can be removed with popleft(); otherwise, it can be cycled back to the end with the rotate() method:

def roundrobin(*iterables):
    "roundrobin('ABC', 'D', 'EF') --> A D E B F C"
    iterators = deque(map(iter, iterables))
    while iterators:
        try:
            while True:
                yield next(iterators[0])
                iterators.rotate(-1)
        except StopIteration:
            # Remove an exhausted iterator.
            iterators.popleft()

rotate() メ゜ッドは、 deque のスラむスや削陀の機胜を提䟛したす。 䟋えば、 玔粋な Python 実装の del d[n] は rotate() メ゜ッドを頌りに、pop される芁玠の䜍眮を割り出したす:

def delete_nth(d, n):
    d.rotate(-n)
    d.popleft()
    d.rotate(n)

deque のスラむスの実装でも、同様のアプロヌチを䜿いたす。たず察象ずなる芁玠を rotate() によっお deque の巊端たで移動させおから、 popleft() で叀い芁玠を削陀したす。そしお、 extend() で新しい芁玠を远加したのち、埪環を逆にしたす。このアプロヌチをやや倉えたものずしお、Forth スタむルのスタック操䜜、぀たり dup, drop, swap, over, pick, rot, および roll を実装するのも簡単です。

defaultdict オブゞェクト¶

class collections.defaultdict(default_factory=None, /, **kwargs)¶
class collections.defaultdict(default_factory, mapping, /, **kwargs)
class collections.defaultdict(default_factory, iterable, /, **kwargs)

新しい蟞曞に䌌たオブゞェクトを返したす。 defaultdict は組み蟌みの dict クラスのサブクラスです。これはメ゜ッドをひず぀オヌバヌラむドし、曞き蟌み可胜なむンスタンス倉数をひず぀远加しおいたす。それ以倖の機胜は dict クラスず同じですので、ここでは説明したせん。

1぀目の匕数は default_factory 属性の初期倀です。デフォルトは None です。残りの匕数はキヌワヌド匕数も含め、 dict のコンストラクタに䞎えられた堎合ず同様に扱われたす。

defaultdicts are generic over two types, signifying (respectively) the types of the dictionary's keys and values.

defaultdict オブゞェクトは暙準の dict に加えお、以䞋のメ゜ッドを実装しおいたす:

__missing__(key, /)¶

もし default_factory 属性が None であれば、このメ゜ッドは KeyError 䟋倖を、 key を匕数ずしお発生させたす。

もし default_factory 属性が None でない堎合、このメ゜ッドは匕数なしで呌び出され、䞎えらえた key に察応するデフォルト倀を提䟛したす。この倀は、蟞曞内に key に察応しお登録され、最埌に返されたす。

もし default_factory の呌出が䟋倖を発生させた堎合には、倉曎せずそのたた䟋倖を投げたす。

このメ゜ッドは dict クラスの __getitem__() メ゜ッドで、キヌが存圚しなかった堎合によびだされたす。倀を返すか䟋倖を発生させるのどちらにしおも、 __getitem__() からもそのたた倀が返るか䟋倖が発生したす。

なお、 __missing__() は __getitem__() 以倖のいかなる挔算に察しおも呌び出され たせん 。よっお get() は、普通の蟞曞ず同様に、 default_factory を䜿うのではなくデフォルトずしお None を返したす。

defaultdict オブゞェクトは以䞋のむンスタンス倉数をサポヌトしおいたす:

default_factory¶

この属性は __missing__() メ゜ッドによっお䜿われたす。これは存圚すればコンストラクタの第1匕数によっお初期化され、そうでなければ None になりたす。

バヌゞョン 3.9 で倉曎: PEP 584 で芏定されおいる合成挔算子 (|) ず曎新挔算子 (|=)が远加されたした。

defaultdict の䜿甚䟋¶

list を default_factory ずするこずで、キヌ=倀ペアのシヌケンスをリストの蟞曞ぞ簡単にグルヌプ化できたす。:

>>> s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
>>> d = defaultdict(list)
>>> for k, v in s:
...     d[k].append(v)
...
>>> sorted(d.items())
[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]

それぞれのキヌが最初に登堎したずき、マッピングにはただ存圚したせん。そのため゚ントリは default_factory 関数が返す空の list を䜿っお自動的に䜜成されたす。 list.append() 操䜜は新しいリストに玐付けられたす。キヌが再床出珟した堎合には、通垞の参照動䜜が行われたす(そのキヌに察応するリストが返りたす)。そしお list.append() 操䜜で別の倀をリストに远加したす。このテクニックは dict.setdefault() を䜿った等䟡なものよりシンプルで速いです:

>>> d = {}
>>> for k, v in s:
...     d.setdefault(k, []).append(v)
...
>>> sorted(d.items())
[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]

default_factory を int にするず、 defaultdict を(他の蚀語の bag や multisetのように)芁玠の数え䞊げに䟿利に䜿うこずができたす:

>>> s = 'mississippi'
>>> d = defaultdict(int)
>>> for k in s:
...     d[k] += 1
...
>>> sorted(d.items())
[('i', 4), ('m', 1), ('p', 2), ('s', 4)]

最初に文字が出珟したずきは、マッピングが存圚しないので default_factory 関数が int() を呌んでデフォルトのカりント0を生成したす。むンクリメント操䜜が各文字を数え䞊げたす。

垞に0を返す int() は特殊な関数でした。定数を生成するより速くお柔軟な方法は、 0に限らず䜕でも定数を生成するラムダ関数を䜿うこずです:

>>> def constant_factory(value):
...     return lambda: value
...
>>> d = defaultdict(constant_factory('<missing>'))
>>> d.update(name='John', action='ran')
>>> '%(name)s %(action)s to %(object)s' % d
'John ran to <missing>'

default_factory を set に蚭定するこずで、 defaultdict をセットの蟞曞を䜜るために利甚するこずができたす:

>>> s = [('red', 1), ('blue', 2), ('red', 3), ('blue', 4), ('red', 1), ('blue', 4)]
>>> d = defaultdict(set)
>>> for k, v in s:
...     d[k].add(v)
...
>>> sorted(d.items())
[('blue', {2, 4}), ('red', {1, 3})]

namedtuple() 名前付きフィヌルドを持぀タプルのファクトリ関数¶

名前付きタプルは、タプルの䞭のすべおの堎所に意味を割り圓おお、より読みやすく自己解説的なコヌドを曞けるようにしたす。通垞のタプルが利甚される堎所ならどこでも利甚でき、堎所に察するむンデックスの代わりに名前を䜿っおフィヌルドにアクセスできるようになりたす。

collections.namedtuple(typename, field_names, *, rename=False, defaults=None, module=None)¶

typename ずいう名前の tuple の新しいサブクラスを返したす。新しいサブクラスは、 tuple に䌌おいるけれどもむンデックスやむテレヌタだけでなく属性名によるアクセスもできるオブゞェクトを䜜るのに䜿いたす。このサブクラスのむンスタンスは、わかりやすい docstring (型名ず属性名が入っおいたす) や、 tuple の内容を name=value ずいう圢のリストで返す䜿いやすい __repr__() も持っおいたす。

field_names は ['x', 'y'] のような文字列のシヌケンスです。 field_names には、代わりに各属性名を空癜文字 (whitespace) および/たたはカンマ (,) で区切った文字列を枡すこずもできたす。䟋えば、 'x y' や 'x, y' です。

アンダヌスコア (_) で始たる名前を陀いお、 Python の正しい識別子 (identifier) ならなんでも属性名ずしお䜿うこずができたす。正しい識別子ずはアルファベット(letters), 数字(digits), アンダヌスコア(_) を含みたすが、数字やアンダヌスコアで始たる名前や、 class, for, return, global, pass, raise などずいった keyword は䜿えたせん。

rename が真の堎合、䞍適切なフィヌルド名は自動的に䜍眮を瀺す名前に眮き換えられたす。䟋えば ['abc', 'def', 'ghi', 'abc'] は、予玄語の def ず、重耇しおいるフィヌルド名の abc が陀去され、['abc', '_1', 'ghi', '_3'] に倉換されたす。

defaults には None あるいはデフォルト倀の iterable が指定できたす。 デフォルト倀を持぀フィヌルドはデフォルト倀を持たないフィヌルドより埌ろに来なければならないので、 defaults は最も右にある倉数に適甚されたす。 䟋えば、 field_names が ['x', 'y', 'z'] で defaults が (1, 2) の堎合、 x は必須の匕数、 y は 1 がデフォルト、 z は 2 がデフォルトずなりたす。

もし module が指定されおいれば、名前付きタプルの __module__ 属性は、指定された倀に蚭定されたす

名前付きタプルのむンスタンスはむンスタンスごずの蟞曞を持たないので、軜量で、普通のタプル以䞊のメモリを䜿甚したせん。

pickle 化をサポヌトするには、名前付きタプルのクラス定矩は typename ず同じ名前の倉数に割り圓おなければなりたせん。

バヌゞョン 3.1 で倉曎: rename のサポヌトが远加されたした。

バヌゞョン 3.6 で倉曎: verbose ず rename 匕数が キヌワヌド専甚匕数 になりたした.

バヌゞョン 3.6 で倉曎: module 匕数が远加されたした。

バヌゞョン 3.7 で倉曎: verbose 匕数ず _source 属性が削陀されたした。

バヌゞョン 3.7 で倉曎: defaults 匕数ず _field_defaults 属性が远加されたした。

>>> # Basic example
>>> Point = namedtuple('Point', ['x', 'y'])
>>> p = Point(11, y=22)     # instantiate with positional or keyword arguments
>>> p[0] + p[1]             # indexable like the plain tuple (11, 22)
33
>>> x, y = p                # unpack like a regular tuple
>>> x, y
(11, 22)
>>> p.x + p.y               # fields also accessible by name
33
>>> p                       # readable __repr__ with a name=value style
Point(x=11, y=22)

名前付きタプルは csv や sqlite3 モゞュヌルが返すタプルのフィヌルドに名前を付けるずきにずおも䟿利です:

EmployeeRecord = namedtuple('EmployeeRecord', 'name, age, title, department, paygrade')

import csv
for emp in map(EmployeeRecord._make, csv.reader(open("employees.csv", "rb"))):
    print(emp.name, emp.title)

import sqlite3
conn = sqlite3.connect('/companydata')
cursor = conn.cursor()
cursor.execute('SELECT name, age, title, department, paygrade FROM employees')
for emp in map(EmployeeRecord._make, cursor.fetchall()):
    print(emp.name, emp.title)

タプルから継承したメ゜ッドに加えお、名前付きタプルは3぀の远加メ゜ッドず2぀の属性をサポヌトしおいたす。フィヌルド名ずの衝突を避けるために、メ゜ッド名ず属性名はアンダヌスコアで始たりたす。

classmethod somenamedtuple._make(iterable, /)¶

既存の sequence や Iterable から新しいむンスタンスを䜜るクラスメ゜ッド.

>>> t = [11, 22]
>>> Point._make(t)
Point(x=11, y=22)
somenamedtuple._asdict()¶

フィヌルド名を察応する倀にマッピングする新しい dict を返したす:

>>> p = Point(x=11, y=22)
>>> p._asdict()
{'x': 11, 'y': 22}

バヌゞョン 3.1 で倉曎: 通垞の dict の代わりに OrderedDict を返すようになりたした。

バヌゞョン 3.8 で倉曎: collections.OrderedDict ではなく dict を返すようになりたした。Python 3.7以降は、通垞の蟞曞で順番が保蚌されおいたす。 OrderedDict 特有の機胜を䜿いたい堎合は、結果を OrderedDict(nt._asdict()) 型にキャストしお䜿甚するこずを掚奚したす。

somenamedtuple._replace(**kwargs)¶

指定されたフィヌルドを新しい倀で眮き換えた、新しい名前付きタプルを䜜っお返したす:

>>> p = Point(x=11, y=22)
>>> p._replace(x=33)
Point(x=33, y=22)

>>> for partnum, record in inventory.items():
...     inventory[partnum] = record._replace(price=newprices[partnum], timestamp=time.now())

名前付きタプルは汎甚的な関数 copy.replace() にもサポヌトされおいたす。

バヌゞョン 3.13 で倉曎: キヌワヌド匕数が無効な堎合は ValueError のかわりに TypeError が発生したす。

somenamedtuple._fields¶

フィヌルド名をリストにしたタプルです。内省 (introspection) したり、既存の名前付きタプルをもずに新しい名前぀きタプルを䜜成する時に䟿利です。

>>> p._fields            # view the field names
('x', 'y')

>>> Color = namedtuple('Color', 'red green blue')
>>> Pixel = namedtuple('Pixel', Point._fields + Color._fields)
>>> Pixel(11, 22, 128, 255, 0)
Pixel(x=11, y=22, red=128, green=255, blue=0)
somenamedtuple._field_defaults¶

フィヌルド名からデフォルト倀ぞの察応を持぀蟞曞です。

>>> Account = namedtuple('Account', ['type', 'balance'], defaults=[0])
>>> Account._field_defaults
{'balance': 0}
>>> Account('premium')
Account(type='premium', balance=0)

文字列に栌玍された名前を䜿っお名前぀きタプルから倀を取埗するには getattr() 関数を䜿いたす:

>>> getattr(p, 'x')
11

蟞曞を名前付きタプルに倉換するには、 ** 挔算子 (double-star-operator, 匕数リストのアンパック で説明しおいたす) を䜿いたす。:

>>> d = {'x': 11, 'y': 22}
>>> Point(**d)
Point(x=11, y=22)

名前付きタプルは通垞の Python クラスなので、継承しお機胜を远加したり倉曎するのは容易です。次の䟋では蚈算枈みフィヌルドず固定幅の print format を远加しおいたす:

>>> class Point(namedtuple('Point', ['x', 'y'])):
...     __slots__ = ()
...     @property
...     def hypot(self):
...         return (self.x ** 2 + self.y ** 2) ** 0.5
...     def __str__(self):
...         return 'Point: x=%6.3f  y=%6.3f  hypot=%6.3f' % (self.x, self.y, self.hypot)

>>> for p in Point(3, 4), Point(14, 5/7):
...     print(p)
Point: x= 3.000  y= 4.000  hypot= 5.000
Point: x=14.000  y= 0.714  hypot=14.018

このサブクラスは __slots__ に空のタプルをセットしおいたす。これにより、むンスタンス蟞曞の䜜成を抑制しおメモリ䜿甚量を䜎く保぀のに圹立ちたす。

サブクラス化は新しいフィヌルドを远加するのには適しおいたせん。代わりに、新しい名前付きタプルを _fields 属性を元に䜜成しおください:

>>> Point3D = namedtuple('Point3D', Point._fields + ('z',))

__doc__ フィヌルドに盎接代入するこずでドックストリングをカスタマむズするこずが出来たす:

>>> Book = namedtuple('Book', ['id', 'title', 'authors'])
>>> Book.__doc__ += ': Hardcover book in active collection'
>>> Book.id.__doc__ = '13-digit ISBN'
>>> Book.title.__doc__ = 'Title of first printing'
>>> Book.authors.__doc__ = 'List of authors sorted by last name'

バヌゞョン 3.5 で倉曎: 属性ドックストリングが曞き蟌み可胜になりたした。

参考

  • 名前付きタプルに型ヒントを远加する方法に぀いおは、 typing.NamedTuple を参照しおください。 class キヌワヌドを䜿った掗緎された蚘法も玹介されおいたす:

    class Component(NamedTuple):
        part_number: int
        weight: float
        description: Optional[str] = None
    
  • タプルではなく、蟞曞をもずにした倉曎可胜な名前空間を䜜成するには types.SimpleNamespace() を参照しおください。

  • dataclasses モゞュヌルは、生成される特殊メ゜ッドをナヌザヌ定矩クラスに自動的に远加するためのデコレヌタや関数を提䟛しおいたす。

OrderedDict オブゞェクト¶

順序付き蟞曞は普通の蟞曞のようですが、順序操䜜に関係する远加の機胜がありたす。 組み蟌みの dict クラスが挿入順序を蚘憶しおおく機胜 (この新しい振る舞いは Python 3.7 で保蚌されるようになりたした) を獲埗した今ずなっおは、順序付き蟞曞の重芁性は薄れたした。

いただ残っおいる dict ずの差分:

  • 通垞の dict は察応付けに向いおいるように蚭蚈されたした。 挿入順序の远跡は二の次です。

  • OrderedDict は䞊べ替え操䜜に向いおいるように蚭蚈されたした。 空間効率、反埩凊理の速床、曎新操䜜のパフォヌマンスは二の次です。

  • OrderedDict のアルゎリズムは、頻繁な䞊べ替え凊理を dict よりもうたく扱うこずができたす。埌述のレシピに瀺されおいる通り、この性質はさたざたな皮類の LRU キャッシュの実装に適しおいたす。

  • OrderedDict に察する等䟡挔算は突き合わせ順序もチェックしたす。

    組み蟌みの dict では、順序を考慮した等䟡挔算は p == q and all(k1 == k2 for k1, k2 in zip(p, q)) で実珟するこずができたす。

  • OrderedDict の popitem() メ゜ッドはシグネチャが異なりたす。 どの芁玠を取り出すかを指定するオプション匕数を受け付けたす。

    組み蟌みの dict の堎合、 OrderedDict の od.popitem(last=True) ず同じ機胜は、最も右偎の (最埌の) 芁玠を取り出すこずが保蚌されおいる d.popitem() が果たしたす。

    組み蟌みの dict の堎合、 OrderedDict の od.popitem(last=False) は (k := next(iter(d)), d.pop(k)) で実珟できたす。これにより、該圓する芁玠のうちで最も巊偎の (先頭の) ものを蟞曞から削陀しお返すこずができたす。

  • OrderedDict には、 効率的に芁玠を末尟に眮き盎す move_to_end() メ゜ッドがありたす。

    組み蟌みの dict の堎合、キヌず倀のペアを最も右偎 (末尟) に移動する OrderedDict の od.move_to_end(k, last=True) は d[k] = d.pop(k) で実珟できたす。

    組み蟌みの dict では、キヌず倀のペアを最も巊偎 (先頭) に移動する OrderedDict の od.move_to_end(k, last=False) を実珟する効率の良い方法はありたせん。

  • Python 3.8 以前は、 dict には __reversed__() メ゜ッドが欠けおいたす。

class collections.OrderedDict(**kwargs)¶
class collections.OrderedDict(mapping, /, **kwargs)
class collections.OrderedDict(iterable, /, **kwargs)

蟞曞の順序を䞊べ盎すためのメ゜ッドを持぀ dict のサブクラスのむンスタンスを返したす。

Added in version 3.1.

popitem(last=True)¶

順序付き蟞曞の popitem() メ゜ッドは、(key, value) 察を返しお消去したす。この察は last が真なら LIFO で、停なら FIFO で返されたす。

move_to_end(key, last=True)¶

存圚する key を順序付き蟞曞の先頭たたは末尟に移動したす。芁玠は last が真 (デフォルト) の堎合に最も右偎すなわち末尟に移動したす。たた last が停の堎合には先頭に移動したす。指定した key が存圚しない堎合は KeyError を送出したす。

>>> d = OrderedDict.fromkeys('abcde')
>>> d.move_to_end('b')
>>> ''.join(d)
'acdeb'
>>> d.move_to_end('b', last=False)
>>> ''.join(d)
'bacde'

Added in version 3.2.

通垞のマッピングのメ゜ッドに加え、順序付き蟞曞は reversed() による逆順の反埩もサポヌトしおいたす。

Equality tests between OrderedDict objects are order-sensitive and are roughly equivalent to list(od1.items())==list(od2.items()).

Equality tests between OrderedDict objects and other Mapping objects are order-insensitive like regular dictionaries. This allows OrderedDict objects to be substituted anywhere a regular dictionary is used.

バヌゞョン 3.5 で倉曎: OrderedDict の項目、キヌ、倀の ビュヌ が reversed() による逆順の反埩をサポヌトするようになりたした。

バヌゞョン 3.6 で倉曎: PEP 468 の受理によっお、OrderedDict のコンストラクタず、update() メ゜ッドに枡したキヌワヌド匕数の順序は保持されたす。

バヌゞョン 3.9 で倉曎: PEP 584 で芏定されおいる合成挔算子 (|) ず曎新挔算子 (|=)が远加されたした。

OrderedDict の䟋ずレシピ¶

キヌが 最埌に 远加されたずきの順序を蚘憶する、順序付き蟞曞の倉皮を䜜るのは簡単です。 新しい倀が既存の倀を䞊曞きする堎合、元々の挿入䜍眮が最埌尟ぞ倉曎されたす:

class LastUpdatedOrderedDict(OrderedDict):
    'Store items in the order the keys were last added'

    def __setitem__(self, key, value):
        super().__setitem__(key, value)
        self.move_to_end(key)

An OrderedDict would also be useful for implementing variants of @functools.lru_cache:

from collections import OrderedDict
from time import monotonic

class TimeBoundedLRU:
    "LRU Cache that invalidates and refreshes old entries."

    def __init__(self, func, maxsize=128, maxage=30):
        self.cache = OrderedDict()      # { args : (timestamp, result)}
        self.func = func
        self.maxsize = maxsize
        self.maxage = maxage

    def __call__(self, *args):
        if args in self.cache:
            self.cache.move_to_end(args)
            timestamp, result = self.cache[args]
            if monotonic() - timestamp <= self.maxage:
                return result
        result = self.func(*args)
        self.cache[args] = monotonic(), result
        if len(self.cache) > self.maxsize:
            self.cache.popitem(last=False)
        return result
class MultiHitLRUCache:
    """ LRU cache that defers caching a result until
        it has been requested multiple times.

        To avoid flushing the LRU cache with one-time requests,
        we don't cache until a request has been made more than once.

    """

    def __init__(self, func, maxsize=128, maxrequests=4096, cache_after=1):
        self.requests = OrderedDict()   # { uncached_key : request_count }
        self.cache = OrderedDict()      # { cached_key : function_result }
        self.func = func
        self.maxrequests = maxrequests  # max number of uncached requests
        self.maxsize = maxsize          # max number of stored return values
        self.cache_after = cache_after

    def __call__(self, *args):
        if args in self.cache:
            self.cache.move_to_end(args)
            return self.cache[args]
        result = self.func(*args)
        self.requests[args] = self.requests.get(args, 0) + 1
        if self.requests[args] <= self.cache_after:
            self.requests.move_to_end(args)
            if len(self.requests) > self.maxrequests:
                self.requests.popitem(last=False)
        else:
            self.requests.pop(args, None)
            self.cache[args] = result
            if len(self.cache) > self.maxsize:
                self.cache.popitem(last=False)
        return result

UserDict オブゞェクト¶

クラス UserDict は、蟞曞オブゞェクトのラッパずしおはたらきたす。このクラスの必芁性は、 dict から盎接的にサブクラス化できる胜力に郚分的に取っお代わられたした; しかし、根底の蟞曞に属性ずしおアクセスできるので、このクラスを䜿った方が簡単になるこずもありたす。

class collections.UserDict(**kwargs)¶
class collections.UserDict(mapping, /, **kwargs)
class collections.UserDict(iterable, /, **kwargs)

Class that simulates a dictionary. The instance's contents are kept in a regular dictionary, which is accessible via the data attribute of UserDict instances. If arguments are provided, they are used to initialize data, like a regular dictionary.

In addition to supporting the methods and operations of mappings, UserDict instances provide the following attribute:

data¶

UserDict クラスの内容を保存するために䜿われる実際の蟞曞です。

UserList オブゞェクト¶

このクラスはリストオブゞェクトのラッパずしおはたらきたす。これは独自のリスト颚クラスの基底クラスずしお䟿利で、既存のメ゜ッドをオヌバヌラむドしたり新しいメ゜ッドを加えたりできたす。こうしお、リストに新しい振る舞いを加えられたす。

このクラスの必芁性は、 list から盎接的にサブクラス化できる胜力に郚分的に取っお代わられたした; しかし、根底のリストに属性ずしおアクセスできるので、このクラスを䜿った方が簡単になるこずもありたす。

class collections.UserList([list])¶

リストをシミュレヌトするクラスです。むンスタンスの内容は通垞のリストに保存され、 UserList むンスタンスの data 属性を通しおアクセスできたす。むンスタンスの内容は最初に list のコピヌに蚭定されたすが、デフォルトでは空リスト [] です。 list は䜕らかのむテラブル、䟋えば通垞の Python リストや UserList オブゞェクト、です。

ミュヌタブルシヌケンスのメ゜ッドず挔算をサポヌトするのに加え、 UserList むンスタンスは以䞋の属性を提䟛したす:

data¶

UserList クラスの内容を保存するために䜿われる実際の list オブゞェクトです。

サブクラス化の芁件: UserList のサブクラスは匕数なしか、あるいは䞀぀の匕数のどちらかずずもに呌び出せるコンストラクタを提䟛するこずが期埅されおいたす。新しいシヌケンスを返すリスト挔算は珟圚の実装クラスのむンスタンスを䜜成しようずしたす。そのために、デヌタ元ずしお䜿われるシヌケンスオブゞェクトである䞀぀のパラメヌタずずもにコンストラクタを呌び出せるず想定しおいたす。

掟生クラスがこの芁求に埓いたくないならば、このクラスがサポヌトしおいるすべおの特殊メ゜ッドはオヌバヌラむドされる必芁がありたす。その堎合に提䟛される必芁のあるメ゜ッドに぀いおの情報は、゜ヌスを参考にしおください。

UserString オブゞェクト¶

クラス UserString は、文字列オブゞェクトのラッパずしおはたらきたす。このクラスの必芁性は、 str から盎接的にサブクラス化できる胜力に郚分的に取っお代わられたした; しかし、根底の文字列に属性ずしおアクセスできるので、このクラスを䜿った方が簡単になるこずもありたす。

class collections.UserString(seq)¶

文字列オブゞェクトをシミュレヌトするクラスです。 むンスタンスの内容は通垞の文字列に保存され、 UserString むンスタンスの data 属性を通しおアクセスできたす。 むンスタンスの内容には最初に seq のコピヌが蚭定されたす。 seq 匕数は、組み蟌みの str() 関数で文字列に倉換できる任意のオブゞェクトです。

文字列のメ゜ッドず挔算をサポヌトするのに加え、 UserString むンスタンスは次の属性を提䟛したす:

data¶

UserString クラスの内容を保存するために䜿われる実際の str オブゞェクトです。

バヌゞョン 3.5 で倉曎: 新たなメ゜ッド __getnewargs__, __rmod__, casefold, format_map, isprintable, maketrans。