按添加顺序为字典分配值
Assign values to dictionary by order they were added
正如标题所言,我想创建一个以 phone 数字作为键的字典,每次添加新数字时我都希望它的值递增 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)
这是我目前的代码,我尝试为我的问题创建一个列表,但该计划很快就失败了。
使用 defaultdict,如果您确实希望输出按最少到最多的顺序排序,只需对输出进行排序:
sorted_no = defaultdict(int)
for line in customers:
rows = line.split(";")
sorted_no[rows[0]] += 1
或者只使用计数器字典:
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)
给出 customers 中每一行的每个索引,但我们传入 1 作为起始索引,因此我们从 1
而不是 0
.
开始
如果我理解你的话,你需要做的就是增加你使用的数量:
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}
看到的第一个唯一 phone 数字得到 1
,第二个 2
,等等
这可能是完成此操作的较短方法之一(感谢评论中的 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
)时,您可以动态更改函数的 return 值。
虽然有点奇怪:)
正如标题所言,我想创建一个以 phone 数字作为键的字典,每次添加新数字时我都希望它的值递增 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)
这是我目前的代码,我尝试为我的问题创建一个列表,但该计划很快就失败了。
使用 defaultdict,如果您确实希望输出按最少到最多的顺序排序,只需对输出进行排序:
sorted_no = defaultdict(int)
for line in customers:
rows = line.split(";")
sorted_no[rows[0]] += 1
或者只使用计数器字典:
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)
给出 customers 中每一行的每个索引,但我们传入 1 作为起始索引,因此我们从 1
而不是 0
.
如果我理解你的话,你需要做的就是增加你使用的数量:
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}
看到的第一个唯一 phone 数字得到 1
,第二个 2
,等等
这可能是完成此操作的较短方法之一(感谢评论中的 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
)时,您可以动态更改函数的 return 值。
虽然有点奇怪:)