按添加顺序将值分配给字典

时间:2015-01-25 19:02:51

标签: python dictionary python-3.4

相当于标题所说的内容,我想创建一个字典,其中包含电话号码作为键,每次添加新号码时,我希望其值增加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)

这是我到目前为止的代码,我尝试为我的问题创建一个列表,但该计划很快就崩溃了。

3 个答案:

答案 0 :(得分:3)

使用defaultdict,如果你真的希望它按最少到最频繁排序,只需对输出进行排序:

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

或者只是使用Counter dict:

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

实际上只是递增每个元素的计数,因为你没有重复项,所以使用enumerate:

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开始。

答案 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

这会产生类似

的东西
{'7801234567': 4,
 '7801236789': 6,
 '7803214567': 9,
 '7804321098': 7,
 '7804922860': 3,
 '7807890123': 1,
 '7808765432': 2,
 '7808907654': 5,
 '7809876543': 8}

其中显示的第一个唯一电话号码为1,第二个2等等。

答案 2 :(得分: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)时,你可以动态地改变函数的返回值。

虽然它有点奇怪:)