我有这本词典:
db= {'www.baurom.ro':
{0: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
1: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
},
'slbz2':
{0: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
1: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
}
列表:
lista=['www.baurom.ro', 'www.baurom.ro', 'www.baurom.ro', 'www.baurom.ro', 'www.baurom.ro', 'www.baurom.ro', 'www.baurom.ro', 'www.listafirme.ro', 'www.romanian-companies.eu', 'www.risco.ro']
我现在在做什么:
for x in lista:
if x in db:
db[x][0][lista.index(x)]+=1
换句话说,我想计算每个网站在列表中出现的次数和位置。这有效,但在给定的示例中,它将返回如下内容:
{0: [7, 0, 0, 0, 0, 0, 0, 0, 0, 0]
虽然我希望它是:
{0: [1, 1, 1, 1, 1, 1, 1, 0, 0, 0]
我怎样才能做到这一点?我可以使用一个变量,用var = 0然后+ = 1启动它并将其用作人工索引,但是有更多的" pythonic"这样做的方式?
答案 0 :(得分:1)
如果我理解你的问题,你已经拥有db
词典,而你正在寻找enumerate运营商。
您的代码如下所示:
for index, element in enumerate(lista):
if element in db:
db[element][0][index] = 1
答案 1 :(得分:0)
你可以这样做:
for entry in db:
db[entry][0] = [int(x == entry) for x in lista]
print(db) # {'slbz2': {0: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 1: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}, 'www.baurom.ro': {0: [1, 1, 1, 1, 1, 1, 1, 0, 0, 0], 1: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}}
您基本上用{list}理解来替换dictionary
值,该列表理解将dictionary
条目与lista
条目进行比较。如果比较结果为True
,则您将bool
ean值转换为int
eger(True -> 1
,False -> 0
)。
如果lista
中的项目与dictionary
键相比非常有限,您可以这样做:
for entry in set(x for x in lista if x in db):
# rest stays the same
这样,您就可以在key
中的dictionary
中循环并修改 那些lista
。另请注意,您循环使用set
元素构建的lista
来忽略其重复项('www.baurom.ro'
key
编辑一次,而不是lista
onChange
{1}})。
答案 2 :(得分:0)
如果我能正确理解您的问题,您可以根据需要迭代lista
并创建db
:
urls = ['www.baurom.ro', 'www.baurom.ro', 'www.baurom.ro', 'www.baurom.ro', 'www.baurom.ro', 'www.baurom.ro', 'www.baurom.ro', 'www.listafirme.ro', 'www.romanian-companies.eu', 'www.risco.ro']
n = len(urls)
db = {}
for i, url in enumerate(urls):
if not db.get(url):
db[url] = {0: [0] * n} # NOTE: Use numpy for large arrays
db[url][0][i] = 1
print(db)
# {'www.romanian-companies.eu': {0: [0, 0, 0, 0, 0, 0, 0, 0, 1, 0]}, 'www.risco.ro': {0: [0, 0, 0, 0, 0, 0, 0, 0, 0, 1]}, 'www.listafirme.ro': {0: [0, 0, 0, 0, 0, 0, 0, 1, 0, 0]}, 'www.baurom.ro': {0: [1, 1, 1, 1, 1, 1, 1, 0, 0, 0]}}
它只需要通过lista
一次,并且应该非常快。
如果你有一个有趣的网址列表,你可以使用这个变种:
from collections import defaultdict
urls = ['www.baurom.ro', 'www.baurom.ro', 'www.baurom.ro', 'www.baurom.ro', 'www.baurom.ro', 'www.baurom.ro', 'www.baurom.ro', 'www.listafirme.ro', 'www.romanian-companies.eu', 'www.risco.ro']
interesting_urls = set(['www.baurom.ro', 'slbz2'])
n = len(urls)
def url_array():
return {0: [0] * n, 1: [0] * n}
db = defaultdict(url_array)
for i, url in enumerate(urls):
if url in interesting_urls:
db[url][0][i] = 1
print(db)
# defaultdict(<function url_array at 0x7fe8a95b87d0>, {'www.baurom.ro': {0: [1, 1, 1, 1, 1, 1, 1, 0, 0, 0], 1: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]}})