列表

时间:2017-07-07 07:43:41

标签: python list indexing

我有这本词典:

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"这样做的方式?

3 个答案:

答案 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 -> 1False -> 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]}})