python中:namedtuple、OrderedDict、append、insert、extend
車輪の再発明は好きではありませんが、個人的にはインターネットで入手できないものを投稿するのが好きですが、基本的なことを自分で書く場合は、自分に印象を残す必要があります。これはこの記事の場合です。 。以下は、コードを調べる過程で一般的に使用されるいくつかのpythonモジュールの概要です:
(ps:以下でテストされたpythonバージョンは3.7です)
1つ、namedtuple
このメソッドは、Pythonの組み込みコレクションから来ています:コンテナデータ型、公式ウェブサイトは以下を紹介します:
このモジュールは、ターゲット固有のコンテナーを実装して、Python標準の組み込みコンテナーであるdict、list、set、およびtupleの代替を提供します。
一般的なタプル要素は変更できず、要素にはインデックスでのみアクセスできることがわかっていますが、名前付きタプルの方がはるかに便利で、読みやすく、操作性が高くなっています。
collections.namedtuple(typename、field_names、*、rename = False、defaults = None、module = None)
- typenameという名前の新しいタプルサブクラスを返します。この新しいサブクラスは、クラスタプルのオブジェクトを作成するために使用されます。このオブジェクトは、ドメイン名(field_names)で属性値を取得でき、インデックスと反復で値を取得することもできます。
- ドメイン名(field_names)は、['x'、 'y']のような文字列のシーケンスです。さらに、field_namesは、「x y」や「x、y」のように、空白またはコンマで区切った純粋な文字列にすることができます。
>>> from collections import namedtuple
# 其实point = namedtuple('Point', ['x', 'y'])这样写也不会报错
# 但是还是和typename保持一致比较规范吧
>>> Point = namedtuple('Point', ['x', 'y'])
>>> p = Point(11, y=22) # 以位置参数或者关键字参数实例化
>>> p[0] + p[1] # 可像普通元组一样索引(11, 22)
33
>>> x, y = p
>>> x, y
(11, 22)
>>> p.x + p.y # 属性可以通过“.”加名字访问
33
>>> p.x = 33 # 属性还是不可以直接更改
Traceback (most recent call last):
File "<pyshell#10>", line 1, in <module>
p.x = 33
AttributeError: can't set attribute
>>> p._replace(x=33) # 这样也不行,是返回一个新的实例
Point(x=33, y=22) # 所以不管是tuple还是namedtuple
>>> p.x # 就用来保存一些不可更改的值的东西吧
11
>>> id(p._replace(x=33))
1618244029320
>>> id(p)
1618244029104
>>> p
Point(x=11, y=22)
# 再来看我实际碰到的一个例子吧
# ResNet stage specification
>>>StageSpec = namedtuple(
"StageSpec",
[
"index", # Index of the stage, eg 1, 2, ..,. 5
"block_count", # Number of residual blocks in the stage
"return_features", # True => return the last feature map from this stage
],
)
>>> ResNet50StagesTo5 = tuple(
StageSpec(index=i, block_count=c, return_features=r)
for (i, c, r) in ((1, 3, False), (2, 4, False),
(3, 6, False), (4, 3, True))
)
>>> ResNet50StagesTo5
(StageSpec(index=1, block_count=3, return_features=False),
StageSpec(index=2, block_count=4, return_features=False),
StageSpec(index=3, block_count=6, return_features=False),
StageSpec(index=4, block_count=3, return_features=True))
二、OrderedDict
これは、コレクション内のdictの代替手段でもあります。コンテナーデータ型:collections.OrderedDict([items])
順序付けられた辞書は通常の辞書と同じですが、並べ替え操作に関連するいくつかの追加機能があります。注:Python 3.6 / 3.7の組み込みのdictクラスには、挿入順序を記憶する機能もあります(python3.5はまだ覚えていません)。元々、最大の違いは薄れています[これを書いているときにしか知りませんでした]
>>> from collections import OrderedDict
>>> d1={
}
>>> d1['a']='A'
>>> d1['b']='B'
>>> d1['c']='C'
>>>> for k,v in d1.items(): # 在python3.7里面也是记住顺序了
... print(k,v) # 在3.5会打乱顺序输出的
...
a A
b B
c C
>>> d2={
}
>>> d2['c']='C'
>>> d2['b']='B'
>>> d2['a']='A'
>>>> d1
{
'a': 'A', 'b': 'B', 'c': 'C'}
>>>> d2
{
'c': 'C', 'b': 'B', 'a': 'A'}
>>> d1 == d2 # 这里注意,普通字典还是相等的,区别这里来了
True
>>> d3 = OrderedDict()
>>> d4 = OrderedDict()
>>> d3['a']='A'
>>> d3['b']='B'
>>> d3['c']='C'
>>> d4['c']='C'
>>> d4['b']='B'
>>> d4['a']='A'
>>> d3
OrderedDict([('a', 'A'), ('b', 'B'), ('c', 'C')])
>>> d4
OrderedDict([('c', 'C'), ('b', 'B'), ('a', 'A')])
>>> d3 == d4 # 记住顺序好像一样了,但是这不一样
False
>>> new_list = [("name", "lsm"), ("sex", "male"), ("face", "handsome")]
>>> new_dict = OrderedDict(new_list)
>>> new_dict
OrderedDict([('name', 'lsm'), ('sex', 'male'), ('face', 'handsome')])
>>> ano_dict = OrderedDict.fromkeys(new_list)
>>> ano_dict
OrderedDict([(('name', 'lsm'), None), (('sex', 'male'), None), (('face', 'handsome'), None)])
>>> k,v = new_dict.popitem()
>>> k,v
('face', 'handsome')
>>> new_dict.move_to_end('name')
>>> new_dict
OrderedDict([('sex', 'male'), ('name', 'lsm')])
3、追加
これは、一般的に使用されるリストのメソッドです:array.append(x)
配列の最後に値xの新しいアイテムを追加します
>>> a = [1, 2, 3]
>>> a.append(4)
>>> a.append(5,6)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: append() takes exactly one argument (2 given)
>>> a.append((5,6))
>>> a
[1, 2, 3, 4, (5, 6)]
4、挿入
主にこれは一般的には使用されません:array.insert(i、x)
配列のi位置の前に、値xを新しい項目として挿入します。負の値は、配列の終わりを基準にして考慮されます
>>> a = [1, 2, 3]
>>> a.insert(0, 0)
>>> a
[0, 1, 2, 3]
>>> a.insert(1, 0.5)
>>> a
[0, 0.5, 1, 2, 3]
>>> a.insert(-1, 9)
>>> a
[0, 0.5, 1, 2, 9, 3]
5、拡張
これも一般的には使用されません:array.extend(iterable):
iterableから配列の最後にアイテムを追加します。iterableが別の配列である場合は、まったく同じ型コードである必要があります。そうでない場合、TypeErrorが発生します。iterableが配列でない場合は、iterableオブジェクトである必要があり、その要素は、配列に追加できる適切なタイプである必要があります。
>>> a = [1, 2, 3]
>>> a.extend(4)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'int' object is not iterable
>>> a.extend((4,5)) # 注意与append的区别
>>> a
[1, 2, 3, 4, 5]
>>> a.extend([6,7])
>>> a
[1, 2, 3, 4, 5, 6, 7]
>>> a.extend((8,))
>>> a
[1, 2, 3, 4, 5, 6, 7, 8]
>>> a.extend(('lz',))
>>> a
[1, 2, 3, 4, 5, 6, 7, 8, 'lz']
リストの詳細については、次を参照してください
。array—数値の効率的な配列
[リストではなく配列と呼ばれる理由がわかりません]