Pythonic способ увеличивать и назначать идентификаторы из словаря - PullRequest
6 голосов
/ 09 марта 2012

Кажется, это довольно распространенный шаблон:

for row in reader:
    c1=row[0]
    if ids.has_key(c1):
        id1=ids.get(c1)
    else:
        currid+=1
        id1=currid
        ids[c1]=currid

Я хочу знать, есть ли лучший способ добиться этого.Что касается одной строки, если операторы идут, я мог бы сделать это очень много:

id1=ids.get(c1) if ids.has_key(c1) else currid+1

Но тогда я застрял с наращиванием currid и вставкой, если был выполнен случай else, и вставил c-> id1 в словарьесли условие if выполнено.

Ответы [ 5 ]

5 голосов
/ 09 марта 2012

Если идентификаторы начинаются с 0:

for row in reader:
    id1 = ids.setdefault(row[0], len(ids))

(Помимо: has_key считается устаревшим. Используйте x in d вместо d.has_key(x).)

4 голосов
/ 09 марта 2012

Если вы не возражаете изменить то, как определяется ids, вы можете пойти с этим (все в стандартной библиотеке):

ids = collections.defaultdict (itertools.count ().next)

Использование тогда очень просто:

print (ids["lol"])
1 голос
/ 09 марта 2012
currid += c1 not in ids
id1 = ids.setdefault(c1, currid)
0 голосов
/ 09 марта 2012

Немного больше pythonyc, с той же семантикой:

for row in reader:
    c1 = row[0]
    if c1 not in ids:
        currid += 1
        ids[c1] = currid
    id1 = ids[c1]
0 голосов
/ 09 марта 2012

Используйте это вместо:

id1 = ids.get(cl, currid + 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...