2015-01-25 2 views
1

Довольно много, что говорит название. Я хочу создать словарь с телефонными номерами в качестве ключей, и каждый раз, когда добавляется новый номер, я хочу, чтобы его значение увеличивалось на единицу.Присвоить значения словарю по порядку, в котором они были добавлены

Как это: { '7806969': 1, '78708708': 2} и т.д. ...

nodes=[1,2,3,4,5,6,7,8,9] 

customers=open('customers.txt','r') 
calls=open('calls.txt.','r') 
sorted_no={} 
for line in customers: 
    rows=line.split(";") 
    if rows[0] not in sorted_no: 
     sorted_no[rows[0]]=nodes[0] 
    else: 
     sorted_no[rows[0]]= 
print(sorted_no) 

Это был код, который я до сих пор, я попытался создать список для моей проблемы, но этот план быстро развалился.

+2

Вы можете думать об использовании 'collections.OrderedDict' – Kasramvd

+0

Есть ли способ решить эту проблему, не импортируя ничего? –

+0

словари неупорядочены ... то есть нет порядка для словарей ...но вместо этого вы можете использовать кортежи или списки ... или просто использовать 'OrderedDict' –

ответ

3

Используйте defaultdict и просто сортировать вывод, если вы на самом деле хотите, отсортирован по крайней мере, наиболее часто:

sorted_no = defaultdict(int) 
for line in customers: 
    rows = line.split(";") 
    sorted_no[rows[0]] += 1 

Или просто использовать счетчик Dict:

from collections import Counter 
with open('customers.txt') as customers: 
    c = Counter(line.split(";")[0] for line in customers) 
    print(c.most_common()) 

Чтобы на самом деле просто увеличиваем подсчет на элемент и потому, что у вас нет дубликатов, используйте перечисление:

with open('customers.txt') as customers: 
    sorted_no = {} 
    for ind, line in enumerate(customers,1): 
     rows=line.split(";") 
     sorted_no[rows[0]] = ind 

Или как дик т понимание:

with open('customers.txt') as customers: 
    sorted_no = {line.split(";")[0]:ind for ind, line in enumerate(customers,1)} 

Если порядок важен просто использовать:

from collections import OrderedDict 
sorted_no = OrderedDict() 

with open('customers.txt') as customers: 
    sorted_no = OrderedDict((line.split(";")[0], ind) for ind, line in enumerate(customers,1)) 

enumerate(customers,1) дает каждому индексу каждой строки клиентов, но мы передаем в 1 в качестве индекса начального поэтому мы начинаем в 1 вместо 0 ,

+0

, возможно, вы смогли прочитать, что OP хочет лучше меня ... так что OP действительно не хочет, чтобы заказал dict? (+1 для декодирования вопроса) –

+0

@JoranBeasley, их код, кажется, пытается увеличить, основываясь на какой-то безумно выглядящей логике индексирования списка. Если они действительно хотят отсортированы, они могут просто сортировать, используя dict.get, как ключ –

+0

Это то, что он возвращает мне: defaultdict (, {'7804922860': 1, '78': 1, '7803214567': 1, '7809876567': 1, '7809876543': 1, '7809876543' ': 1,' 78': 1,' 7808907654 ': 1,' 7808765432 ': 1,' 780789': 1,'98 ': 1}) не совсем то, что я хотел:/ –

2

Если я вас понимаю, все, что вам нужно сделать, это увеличить число вы используете, как вы идете:

sorted_no = {} 
with open("customers.txt") as fp: 
    for line in fp: 
     number = line.split(";")[0] 
     if number not in sorted_no: 
      sorted_no[number] = len(sorted_no) + 1 

Это создает что-то вроде

{'78': 4, 
'78': 6, 
'7803214567': 9, 
'98': 7, 
'7804922860': 3, 
'7807890123': 1, 
'7808765432': 2, 
'7808907654': 5, 
'7809876543': 8} 

где первый уникальный номер телефона видел 1, а второй 2 и т. д.

+0

Почему бы просто не использовать перечисление? На самом деле нет дубликатов. –

+0

@PadraicCunningham: Я не читал комментарий, говоря, что мы знали, что дубликатов нет. – DSM

+0

Что означает fp? –

0

Это, вероятно, один из самых коротких способов сделать это (спасибо Jon Clements в комментариях):

#!/usr/bin/env python3.4 

from collections import defaultdict 
import itertools 

sorted_no = defaultdict(itertools.count(1).__next__) 
for line in customers: 
    rows=line.split(";") 
    # no need to put anything, 
    # just use the key and it increments automagically. 
    sorted_no[rows[0]] 

itertools.count(1) производит генератор, что эквивалентно (примерно) до:

def lazy(): 
    counter = 0 
    while True: 
     counter += 1 
     yield counter 

я оставил свой оригинальный ответ, чтобы люди могли узнать о по умолчанию привязки Гоча, или, возможно, даже использовать его, если они хочу:

#!/usr/bin/env python3.4 

from collections import defaultdict 

def lazy_gen(current=[0]): 
    current[0] += 1 
    return current[0] 

sorted_no = defaultdict(lazy_gen) 
for line in customers: 
    rows=line.split(";") 
    # no need to put anything, 
    # just use the key and it increments automagically. 
    sorted_no[rows[0]] 

Это работает, потому что Python's default assignment happens once, и когда вы используете изменяемый объект (list в данном случае), вы можете изменить функцию» s возвращаемое значение динамически.

Это немного странно, хотя :)

+0

Нет необходимости в функции здесь с (неверно) с использованием аргумента по умолчанию, используйте 'sorted_no = defaultdict (itertools.count (1) .next)' вместо ... –

+0

@JonClements спасибо, я не владею 'itertools' :) –

Смежные вопросы

 Смежные вопросы