Diberikan kamus, bagaimana saya bisa mengetahui jika kunci yang diberikan dalam kamus itu telah disetel ke nilai bukan-Tidak ada?
Yaitu, saya ingin melakukan ini:
my_dict = {}
if (my_dict[key] != None):
my_dict[key] = 1
else:
my_dict[key] += 1
Yaitu, saya ingin menambah nilainya jika sudah ada di sana, atau setel ke 1 sebaliknya.
python
dictionary
Ben
sumber
sumber
Jawaban:
Anda mencari
collections.defaultdict
(tersedia untuk Python 2.5+). Iniakan melakukan apa yang Anda inginkan.
Untuk Python
dict
s reguler , jika tidak ada nilai untuk kunci yang diberikan, Anda tidak akan mendapatkanNone
ketika mengakses dict - aKeyError
akan dinaikkan. Jadi jika Anda ingin menggunakan yang biasadict
, alih-alih kode Anda yang akan Anda gunakansumber
dict
, bisa Anda lakukanmy_dict[key] = my_dict.get(key, 0) + 1
.Saya lebih suka melakukan ini dalam satu baris kode.
Kamus memiliki fungsi, dapatkan, yang mengambil dua parameter - kunci yang Anda inginkan, dan nilai default jika tidak ada. Saya lebih suka metode ini daripada defaultdict karena Anda hanya ingin menangani kasus di mana kunci tidak ada dalam satu baris kode ini, tidak di mana-mana.
sumber
Saya pribadi suka menggunakan
setdefault()
sumber
setdefault
Mengagumkan. Itu tidak mengubah nilai jika sudah ditetapkan untuksome_key
. Misalnya,d={1:2}; d.setdefault(1, 0)
tidak mengganggu nilaid[1]
.Anda butuh
key in dict
idiom untuk itu.Namun, Anda mungkin harus mempertimbangkan untuk menggunakan
defaultdict
(seperti yang disarankan dF).sumber
my_dict[key] is not None
, yang lebih jelas (setidaknya IMHO)if key in my_dict and my_dict[key]:
Untuk menjawab pertanyaan " bagaimana saya bisa mengetahui jika indeks yang diberikan dalam dikt itu telah ditetapkan ke nilai yang tidak ada ", saya lebih suka ini:
Ini sesuai dengan konsep EAFP yang sudah dipanggil (lebih mudah untuk meminta maaf daripada izin). Ini juga menghindari pencarian kunci duplikat dalam kamus karena itu akan
key in my_dict and my_dict[key] is not None
menarik jika pencarian mahal.Untuk masalah aktual yang Anda ajukan, yaitu menambah int jika ada, atau mengaturnya ke nilai default jika tidak, saya juga merekomendasikan
seperti dalam jawaban Andrew Wilkinson.
Ada solusi ketiga jika Anda menyimpan objek yang dapat dimodifikasi di kamus Anda. Contoh umum untuk ini adalah multimap , di mana Anda menyimpan daftar elemen untuk kunci Anda. Dalam hal ini, Anda dapat menggunakan:
Jika nilai untuk kunci tidak ada dalam kamus, metode setdefault akan mengaturnya ke parameter kedua setdefault. Berperilaku seperti standar my_dict [kunci], mengembalikan nilai untuk kunci (yang mungkin merupakan nilai yang baru ditetapkan).
sumber
Setuju dengan cgoldberg. Bagaimana saya melakukannya adalah:
Jadi lakukan seperti di atas, atau gunakan dict default seperti yang disarankan orang lain. Jangan gunakan pernyataan if. Itu bukan Pythonic.
sumber
+=2
atau-=1
? Anda harus ingat untuk mengubah kedua baris. Ini mungkin tampak seperti hal yang sepele sekarang, tetapi itu adalah jenis bug 'sepele' kecil bodoh yang dapat kembali menggigit Anda.Seperti yang dapat Anda lihat dari banyak jawaban, ada beberapa solusi. Satu contoh LBYL (lihat sebelum Anda melompat) belum disebutkan, metode has_key ():
sumber
Cara Anda mencoba melakukannya disebut LBYL (lihat sebelum Anda melompat), karena Anda memeriksa kondisi sebelum mencoba meningkatkan nilai Anda.
Pendekatan lain disebut EAFP (lebih mudah untuk meminta pengampunan daripada izin). Dalam hal ini, Anda hanya akan mencoba operasi (menambah nilainya). Jika gagal, Anda menangkap pengecualian dan menetapkan nilai ke 1. Ini adalah cara yang sedikit lebih Pythonic untuk melakukannya (IMO).
http://mail.python.org/pipermail/python-list/2003-May/205182.html
sumber
Agak terlambat tapi ini seharusnya berhasil.
sumber
Ini tidak langsung menjawab pertanyaan, tetapi bagi saya, sepertinya Anda mungkin menginginkan fungsionalitas koleksi . Penghitung .
Ini menghasilkan output
sumber
defaultdict(int)
dengan beberapa fungsionalitas tambahan sehingga akan bekerja dengan sempurna ketika berhadapan secara eksklusif dengan bilangan bulat tetapi Anda tidak menunjukkan perilaku yang relevan.Inilah satu-liner yang saya buat baru-baru ini untuk menyelesaikan masalah ini. Ini didasarkan pada metode kamus setdefault :
sumber
Saya mencarinya, tidak menemukannya di web lalu mencoba keberuntungan saya dengan Try / Error dan menemukannya
sumber
__contains__
kode produksi. btw.__contains__
sama dengan menggunakanis
.my_dict.__contains__(some_key)
setara dengansome_key in my_dict
, kelebihan beban untukin
operator tidakis