我们如何生成一个元素为dict的列表?

时间:2017-09-11 10:23:35

标签: python

问题之前:

  1. 可能有Android应用程序
  2. 同一个应用程序下有很多版本
  3. 获得最新的应用程序(versionCode表示最新的)
  4. 例如:

    /path/to/apk1/history/v1/xxx.apk versionCode=1
    /path/to/apk1/history/v1.3/xxx.apk versionCode=1.3
    /path/to/apk/v2/xxx.apk versionCode=3
    

    好吧,/path/to/apk/v2/xxx.apk胜出。

    我在做什么?

    1. 使用以下函数从apk文件分析 versionCode def analysisApk(apkPath): outfile = os.popen("./aapt d badging %s " % apkPath,'r').read() match = re.compile("package: name='(\S+)' versionCode='(\d+)' versionName='(\S+)'").match(outfile) packageName=match.group(1) versionCode = match.group(2)
    2. 将唯一的dict附加到存储我们想要的应用程序的全局列表中。
    3. 我可以生成一个单词,但我不知道如何生成一个词典列表
    4. 我可以生成此{packageName:"com.xxx.1",versionCode:2,apkPath:"/path/to/1.apk"}
    5. 的词典列表
    6. 不幸的是,我不知道如何将这些词汇附加到下面的列表中
        

      [{的packageName: “com.xxx.1” 的versionCode:2,apkPath: “/路径/到/ 1.apk”},{的packageName: “com.xxx.2” 的versionCode:2,apkPath: “/path/to/2.0.apk”}, {{的packageName: “com.xxx.2” 的versionCode:1,apkPath: “/路径/到/ v2.apk”}} , ...,{{的packageName: “com.xxx.n” 的versionCode:2,apkPath: “/路径/到/ n.apk”}}]

    7. del line 需要从列表中删除(最新的版本代码来......)

      这句话并不是真正的结果,只是我们理解这个问题的例子

      我的问题是什么:

      1. 如何按照我的观点逐步生成字典列表?
      2. 这个问题还有其他想法吗?

      3 个答案:

      答案 0 :(得分:0)

      如果我理解你的问题,你可以这样做列表理解:

      list_of_dicts = [extract_all_the_info(line) for line in source]
      

      其中extract_all_the_info()执行您在上面执行的正则表达式,并返回一个字典。

      答案 1 :(得分:0)

      根据您的正则表达式,我假设您的输入是一个包含以下行的文件:

      lines = [
          "package: name='/path/to/apk1/history/v1/xxx.apk' versionCode='1' versionName='one'",
          "package: name='/path/to/apk1/history/v1.3/xxx.apk' versionCode='1.3' versionName='two'",
          "package: name='/path/to/apk/v2/xxx.apk' versionCode='3' versionName='three'",
      ]
      

      您可以通过文件句柄的.readlines()功能将行作为列表获取。

      然后你可以遍历它们,使用你需要的任何正则表达式来提取你的值并将它们放在每个循环重新创建的字典中(apk_dict)。

      在进入下一个循环之前,我们将字典放入循环(apk_list)之外的列表.append()

      import re
      
      apk_list = []
      for line in lines:
          apk_dict = {}
          match = re.match("package: name='(\S+)' versionCode='(\d+)' versionName='(\S+)'", line)
          if not match:
              continue
          apk_dict['name'] = match.group(1)
          apk_dict['versionCode'] = match.group(2)
          apk_dict['versionName'] = match.group(3)
          apk_list.append(apk_dict)
      
      print(apk_list)
      

      apk_list将有:

      [
          {
              'versionName': 'one',
              'versionCode': '1',
              'name': '/path/to/apk1/history/v1/xxx.apk'
          },
          {
              'versionName': 'three',
              'versionCode': '3',
              'name': '/path/to/apk/v2/xxx.apk'
          }
      ]
      

      由于我在下面解释的原因,第二行被删除了。

      有些注意事项:

      您正在尝试在正则表达式上使用.compile()。这不符合你的想法。要使用字符串匹配表达式,请使用.match()。编译创建了一种“表达式对象”,您可以使用它来代替表达式。

      接下来,(\d+)对于“1.3”之类的内容不起作用,因为数字之间存在非数字字符。像(\S+)

      这样的东西

      您还必须处理失败的匹配尝试。我只是跳过continue的行。

      答案 2 :(得分:0)

      由于您只想使用字典来获取带有最大versionCode的apk的路径,这将是一种过度杀伤力。 使用两个变量:pathversion。打开第一个apk,在path中保存apkPath,在version中保存versionCode。转到下一个apk。如果其versionCode高于version,请将path设置为apkPath。转到下一个,重复直到您处理完所有apks。之后,您将在path中拥有最高versionCode的apk的路径。

      PS。要在列表中添加内容,请使用" append()":

      new_list = old_list.append(item)