web-dev-qa-db-ja.com

Pythonでセットを複製またはコピーする方法は?

リストをコピーする場合:_shallow_copy_of_list = old_list[:]_。

辞書をコピーする場合:shallow_copy_of_dict = dict(old_dict)

しかし、setについては、new_set = set(old_set)がセットのセットを与えると言うので、同様のことがうまくいかないのではないかと心配しました。

しかし、それは機能します。そこで、参考のためにここに質問と回答を投稿しています。他の誰かが同じ混乱を持っている場合。

46
Evgeni Sergeev

これらは両方ともセットの複製を提供します:

_shallow_copy_of_set = set(old_set)
_

または:

_shallow_copy_of_set = old_set.copy() #Which is more readable.
_

上記の最初の方法does n'tがセットのセットを与える理由は、そのための適切な構文がset([old_set])になるからです。 setsは他のsetsの要素にはなれません。なぜなら、それらは可変であるためにハッシュできないからです。ただし、これはfrozensetsには当てはまりません。 frozenset(frozenset(frozenset([1,2,3]))) == frozenset([1, 2, 3])

したがって、Python(lists、dict、set、frozenset、string)の基本データ構造のインスタンスのいずれかを複製するための経験則:

_a2 = list(a)      #a is a list
b2 = set(b)       #b is a set
c2 = dict(c)      #c is a dict
d2 = frozenset(d) #d is a frozenset
e2 = str(e)       #e is a string
#All of the above give a (shallow) copy.
_

したがって、xがこれらのタイプの場合、

_shallow_copy_of_x = type(x)(x) #Highly unreadable! But economical.
_

dictset、およびfrozensetのみにcopy()メソッドが組み込まれていることに注意してください。均一性と読みやすさのために、リストと文字列にもcopy()メソッドが含まれているとよいでしょう。しかし、少なくともPython 2.7.3でテストしています。

50
Evgeni Sergeev

type(x)(x)ハックの他に、copyモジュールをインポートして、浅いコピーまたは深いコピーを作成できます。

In [29]: d={1: [2,3]}

In [30]: sd=copy.copy(d)
    ...: sd[1][0]=321
    ...: print d
{1: [321, 3]}

In [31]: dd=copy.deepcopy(d)
    ...: dd[1][0]=987
    ...: print dd, d
{1: [987, 3]} {1: [321, 3]}

Docstringから:

Definition: copy.copy(x)
Docstring:
Shallow copy operation on arbitrary Python objects.
10
zhangxaochen