【问题标题】:Item position in list列表中的项目位置
【发布时间】:2017-12-11 10:13:49
【问题描述】:

我有这本词典:

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”的方法?

【问题讨论】:

    标签: python list indexing


    【解决方案1】:

    如果我正确理解您的问题,您已经拥有 db 字典并且您正在寻找 enumerate 运算符。

    您的代码将如下所示:

    for index, element in enumerate(lista):
        if element in db:
            db[element][0][index] = 1 
    

    【讨论】:

      【解决方案2】:

      你可以这样做:

      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]}}
      

      实际上,您将dictionary 值替换为列表理解,该列表理解将dictionary 条目与lista 条目进行比较。如果比较的结果是True,则将boolean 值转换为integer(True -> 1False -> 0)。


      如果lista 中的项目与dictionary 键相比非常有限,您可以这样做:

      for entry in set(x for x in lista if x in db):
          # rest stays the same
      

      这样,您可以循环并编辑 dictionary 中出现在 lista 中的那些 keys。另请注意,您循环遍历由 lista 的元素构造的 set 以忽略其重复项('www.baurom.ro' key 被编辑一次,而不是在 lista 上出现的次数)。

      【讨论】:

      • 我知道这会循环数据库中的所有键,并且数据库可能并且将包含 20k 个网站名称,例如,循环所有这些键效率不高。
      【解决方案3】:

      如果我正确理解您的问题,您可以迭代 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 一次,应该非常快。

      如果你有一个有趣的 url 列表,你可以使用这个变体:

      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]}}) 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-21
        相关资源
        最近更新 更多