Python dict list 动态生成、去重

pengcao89 2017-09-11 05:27:11
有如下需求:
1、很多android apk
2、同一android apk(使用包名来区分是否唯一)有很多不同的版本
3、使用AndroidManifest中的versionCode作为判定是否为最新apk的依据
4、将很多android apk中的最新版本copy到某一目录下(同一apk只拷贝最新的)

例如:
/path/to/apk1/history/v1/xxx.apk
/path/to/apk1/history/v1.3/xxx.apk
/path/to/apk/v2/xxx.apk
--> 只copy /path/to/apk1/v2/xxx.apk
...全文
425 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
张强1990 2017-09-12
  • 打赏
  • 举报
回复
不是很懂问题啊 versionCode是新的就加,不是新的就跳过
混沌鳄鱼 2017-09-11
  • 打赏
  • 举报
回复
我写了一段代码供你参考

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from collections import namedtuple
from random import choice

APK = namedtuple('APK', 'package_name version_code apk_file')

# generate some sample data
sample_list = []
for i in range(100):
    package_name = choice('abcd') + choice('12345')
    version_code = choice([1 , 2, 3, 4, 5])
    apk_file = '/apkdir/{}/v{}/{}.apk'.format(package_name, version_code, package_name)
    sample_list.append(APK(package_name, version_code, apk_file))

print(sample_list)

latest_apks = {}

for apk in sample_list:
    existing_apk = latest_apks.get(apk.package_name, None)
    if (existing_apk is None) or (existing_apk.version_code < apk.version_code):
        latest_apks[apk.package_name] = apk

print(latest_apks)

[APK(package_name='b2', version_code=3, apk_file='/apkdir/b2/v3/b2.apk'), APK(package_name='b4', version_code=1, apk_file='/apkdir/b4/v1/b4.apk'), APK(package_name='b4', version_code=1, apk_file='/apkdir/b4/v1/b4.apk'), APK(package_name='b5', version_code=5, apk_file='/apkdir/b5/v5/b5.apk'), APK(package_name='c1', version_code=4, apk_file='/apkdir/c1/v4/c1.apk'), APK(package_name='d1', version_code=3, apk_file='/apkdir/d1/v3/d1.apk'), APK(package_name='a3', version_code=4, apk_file='/apkdir/a3/v4/a3.apk'), APK(package_name='d2', version_code=3, apk_file='/apkdir/d2/v3/d2.apk'), APK(package_name='b5', version_code=5, apk_file='/apkdir/b5/v5/b5.apk'), APK(package_name='b1', version_code=3, apk_file='/apkdir/b1/v3/b1.apk'), APK(package_name='b4', version_code=2, apk_file='/apkdir/b4/v2/b4.apk'), APK(package_name='a5', version_code=4, apk_file='/apkdir/a5/v4/a5.apk'), APK(package_name='d5', version_code=1, apk_file='/apkdir/d5/v1/d5.apk'), APK(package_name='a5', version_code=1, apk_file='/apkdir/a5/v1/a5.apk'), APK(package_name='a2', version_code=3, apk_file='/apkdir/a2/v3/a2.apk'), APK(package_name='c4', version_code=5, apk_file='/apkdir/c4/v5/c4.apk'), APK(package_name='a4', version_code=5, apk_file='/apkdir/a4/v5/a4.apk'), APK(package_name='b2', version_code=5, apk_file='/apkdir/b2/v5/b2.apk'), APK(package_name='a3', version_code=4, apk_file='/apkdir/a3/v4/a3.apk'), APK(package_name='a4', version_code=1, apk_file='/apkdir/a4/v1/a4.apk')] {'b2': APK(package_name='b2', version_code=5, apk_file='/apkdir/b2/v5/b2.apk'), 'b4': APK(package_name='b4', version_code=2, apk_file='/apkdir/b4/v2/b4.apk'), 'b5': APK(package_name='b5', version_code=5, apk_file='/apkdir/b5/v5/b5.apk'), 'c1': APK(package_name='c1', version_code=4, apk_file='/apkdir/c1/v4/c1.apk'), 'd1': APK(package_name='d1', version_code=3, apk_file='/apkdir/d1/v3/d1.apk'), 'a3': APK(package_name='a3', version_code=4, apk_file='/apkdir/a3/v4/a3.apk'), 'd2': APK(package_name='d2', version_code=3, apk_file='/apkdir/d2/v3/d2.apk'), 'b1': APK(package_name='b1', version_code=3, apk_file='/apkdir/b1/v3/b1.apk'), 'a5': APK(package_name='a5', version_code=4, apk_file='/apkdir/a5/v4/a5.apk'), 'd5': APK(package_name='d5', version_code=1, apk_file='/apkdir/d5/v1/d5.apk'), 'a2': APK(package_name='a2', version_code=3, apk_file='/apkdir/a2/v3/a2.apk'), 'c4': APK(package_name='c4', version_code=5, apk_file='/apkdir/c4/v5/c4.apk'), 'a4': APK(package_name='a4', version_code=5, apk_file='/apkdir/a4/v5/a4.apk')}
pengcao89 2017-09-11
  • 打赏
  • 举报
回复
字典可以生成啊。
问题是想生成一个元素为字典的list,
list中的字典元素的versionCode这个key的值要求是最新的

张强1990 2017-09-11
  • 打赏
  • 举报
回复
引用 3 楼 cpwolaichile 的回复:
[quote=引用 1 楼 zhmwang2008 的回复:] AndroidManifest文件是什么样的
参见我的 #2 我的回复 谢谢。。[/quote] packageName, versionCode都知道了,字典不就出来了吗,还缺什么吗
pengcao89 2017-09-11
  • 打赏
  • 举报
回复
引用 1 楼 zhmwang2008 的回复:
AndroidManifest文件是什么样的
参见我的 #2 我的回复 谢谢。。
pengcao89 2017-09-11
  • 打赏
  • 举报
回复
抱歉,关键信息没提供出来 我能拿到用来判定单个apk的信息(就是说单独的一个apk的packagename、versionCode我都可以顺利拿到) 如下: 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) 我期望的预期: 生成一个[{packageName:"com.xxx.1",versionCode:2,apkPath:"/path/to/1.apk"},{{packageName:"com.xxx.2",versionCode:2,apkPath:"/path/to/2.apk"}},...{{packageName:"com.xxx.n",versionCode:2,apkPath:"/path/to/n.apk"}}] 进而可以通过该字典列表中的apkPath来获取唯一需要copy的apk 现在思路被卡在了如何生成字典列表上了。
张强1990 2017-09-11
  • 打赏
  • 举报
回复
AndroidManifest文件是什么样的

37,719

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧