collections --- ã³ã³ããããŒã¿å¶
ãœãŒã¹ã³ãŒã: Lib/collections/__init__.py
ãã®ã¢ãžã¥ãŒã«ã¯ãæ±çšã® Python çµã¿èŸŒã¿ã³ã³ãã dict, list, set, ããã³ tuple ã«ä»£ãããç¹æ®ãªã³ã³ããããŒã¿åãå®è£
ããŠããŸãã
ååä»ããã£ãŒã«ããæã€ã¿ãã«ã®ãµãã¯ã©ã¹ãäœæãããã¡ã¯ããªé¢æ° |
|
䞡端ã«ããã append ã pop ãé«éã«è¡ãããªã¹ã颚ã®ã³ã³ãã |
|
è€æ°ã®ãããã³ã°ã®äžã€ã®ãã¥ãŒãäœæããèŸæžé¢šã®ã¯ã©ã¹ |
|
ããã·ã¥å¯èœ ãªãªããžã§ã¯ããæ°ãäžããèŸæžã®ãµãã¯ã©ã¹ |
|
é ç®ã远å ãããé åºãèšæ¶ããèŸæžã®ãµãã¯ã©ã¹ |
|
ãã¡ã¯ããªé¢æ°ãåŒã³åºããŠååšããªãå€ãäŸçµŠããèŸæžã®ãµãã¯ã©ã¹ |
|
èŸæžã®ãµãã¯ã©ã¹åãç°¡åã«ããèŸæžãªããžã§ã¯ãã®ã©ãã |
|
ãªã¹ãã®ãµãã¯ã©ã¹åãç°¡åã«ãããªã¹ããªããžã§ã¯ãã®ã©ãã |
|
æååã®ãµãã¯ã©ã¹åãç°¡åã«ããæååãªããžã§ã¯ãã®ã©ãã |
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
Counterobjects 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
ValueErrorif 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
dataattribute ofUserDictinstances. If arguments are provided, they are used to initializedata, like a regular dictionary.In addition to supporting the methods and operations of mappings,
UserDictinstances provide the following attribute:
UserList ãªããžã§ã¯ã¶
ãã®ã¯ã©ã¹ã¯ãªã¹ããªããžã§ã¯ãã®ã©ãããšããŠã¯ããããŸããããã¯ç¬èªã®ãªã¹ã颚ã¯ã©ã¹ã®åºåºã¯ã©ã¹ãšããŠäŸ¿å©ã§ãæ¢åã®ã¡ãœããããªãŒããŒã©ã€ããããæ°ããã¡ãœãããå ãããã§ããŸããããããŠããªã¹ãã«æ°ããæ¯ãèããå ããããŸãã
ãã®ã¯ã©ã¹ã®å¿
èŠæ§ã¯ã list ããçŽæ¥çã«ãµãã¯ã©ã¹åã§ããèœåã«éšåçã«åã£ãŠä»£ããããŸãã; ããããæ ¹åºã®ãªã¹ãã«å±æ§ãšããŠã¢ã¯ã»ã¹ã§ããã®ã§ããã®ã¯ã©ã¹ã䜿ã£ãæ¹ãç°¡åã«ãªãããšããããŸãã
- class collections.UserList([list])¶
ãªã¹ããã·ãã¥ã¬ãŒãããã¯ã©ã¹ã§ããã€ã³ã¹ã¿ã³ã¹ã®å 容ã¯éåžžã®ãªã¹ãã«ä¿åããã
UserListã€ã³ã¹ã¿ã³ã¹ã®data屿§ãéããŠã¢ã¯ã»ã¹ã§ããŸããã€ã³ã¹ã¿ã³ã¹ã®å å®¹ã¯æåã« list ã®ã³ããŒã«èšå®ãããŸãããããã©ã«ãã§ã¯ç©ºãªã¹ã[]ã§ãã list ã¯äœããã®ã€ãã©ãã«ãäŸãã°éåžžã® Python ãªã¹ããUserListãªããžã§ã¯ããã§ãããã¥ãŒã¿ãã«ã·ãŒã±ã³ã¹ã®ã¡ãœãããšæŒç®ããµããŒãããã®ã«å ãã
UserListã€ã³ã¹ã¿ã³ã¹ã¯ä»¥äžã®å±æ§ãæäŸããŸã:
ãµãã¯ã©ã¹åã®èŠä»¶: 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ã