【发布时间】:2016-08-02 17:00:15
【问题描述】:
我有一本名为 dico 的字典,其中包含以下信息:
('libc6-i386', '1.06') : lib32tinfo5
('lib32c-dev', '') : lib32tinfo-dev
('libc6-x32', '2.16') : libx32tinfo5
('libc6-i386', '2.4') : lib32ncursesw5
('libc-dev', '') : libncursesw5-dev
('libncurses5-dev', '5.9+20150516-2ubuntu1') : libncurses5-dbg
('libc6-dev', '') : libncursesw5-dev
('libc6-dev-x32', '') : libx32tinfo-dev
('libc6-i386', '2.16') : lib32tinfo5
('libncursesw5-dev', '5.9+20150516-2ubuntu1') : libncursesw5-dbg
当我调用 comparePackages(dico) 时,我不断得到相同输入的不同结果,例如:
('lib32c-dev', 'Not Specified') lib32tinfo-dev
('libc6-dev', 'Not Specified') libncursesw5-dev
('libc-dev', 'Not Specified') libncursesw5-dev
('libc6-i386', '2.4') lib32ncursesw5
('libc6-x32', '2.16') libx32tinfo5
('libncurses5-dev', '5.9+20150516-2ubuntu1') libncurses5-dbg
('libc6-dev-x32', 'Not Specified') libx32tinfo-dev
('libc6-i386', '2.16') lib32tinfo5
('libncursesw5-dev', '5.9+20150516-2ubuntu1') libncursesw5-dbg
或
('libncurses5-dev', '5.9+20150516-2ubuntu1') libncurses5-dbg
('libncursesw5-dev', '5.9+20150516-2ubuntu1') libncursesw5-dbg
('libc6-i386', '2.16') lib32tinfo5
('lib32c-dev', 'Not Specified') lib32tinfo-dev
('libc6-x32', '2.16') libx32tinfo5
('libc6-dev', 'Not Specified') libncursesw5-dev
('libc6-i386', '2.4') lib32ncursesw5
('libc-dev', 'Not Specified') libncursesw5-dev
或
('libc6-i386', '2.4') lib32ncursesw5
('libc-dev', 'Not Specified') libncursesw5-dev
('libc6-i386', '1.06') lib32tinfo5
('lib32c-dev', 'Not Specified') lib32tinfo-dev
('libncurses5-dev', '5.9+20150516-2ubuntu1') libncurses5-dbg
('libncursesw5-dev', '5.9+20150516-2ubuntu1') libncursesw5-dbg
('libc6-i386', '2.16') lib32tinfo5
('libc6-dev', 'Not Specified') libncursesw5-dev
('libc6-x32', '2.16') libx32tinfo5
这是我的 comparePackages 函数
import apt_pkg
apt_pkg.init_system()
"""
Function that compares package versions and keeps the most recent one.
@param : dictionary
package_dictionary :
keys : tuple
values : string
"""
def comparePackages(package_dictionary):
if(type(package_dictionary) is dict):
list_keys = list(package_dictionary.keys()) #list of tuples
list_values = list(package_dictionary.values()) #list of strings
#list_keys, list_values = list(package_dictionary.items())
dic = {}
for x,y in zip(range(0,len(list_keys)-1),range(0,len(list_values)-1)):
#if 2 tuples have the same package name
if(list_keys[x][0] == list_keys[x+1][0]):
print("Start comparing")
#second element of the tuple x
a = str(list_keys[x][1])
#second element of the tuple x+1
b = str(list_keys[x+1][1])
#compare versions
vc = apt_pkg.version_compare(a,b)
if vc > 0:
#a>b
print("a>b")
max_version = a
elif vc == 0:
#a==b
print("a==b")
max_version = a
elif vc < 0:
#a<b
print("a<b")
max_version = b
if(max_version is '') :
max_version = 'Not Specified'
#create a dict that for each package name has the most recent version
dic[(list_keys[x][0],max_version)] = list_values[y]
else:
version = list_keys[x][1]
if(version is '') :
version = 'Not Specified'
dic[(list_keys[x][0],version)] = list_values[y]
for k,v in dic.items():
print(k,v)
else:
raise TypeError("Argument of comparePackages must be a dictionary.")
预期输出:
('lib32c-dev', 'Not Specified') : lib32tinfo-dev
('libc6-x32', '2.16') : libx32tinfo5
('libc-dev', 'Not Specified') : libncursesw5-dev
('libncurses5-dev', '5.9+20150516-2ubuntu1') : libncurses5-dbg
('libc6-dev', 'Not Specified') : libncursesw5-dev
('libc6-dev-x32', 'Not Specified') : libx32tinfo-dev
('libc6-i386', '2.16') : lib32tinfo5 (or lib32ncursesw5)
('libncursesw5-dev', '5.9+20150516-2ubuntu1') : libncursesw5-dbg
我想知道为什么以及如何纠正它。最后,我需要的是一个字典,对于元组中存在的每个包都有最新版本。丢失同一个包的 2 个值中的 1 个不是问题。谢谢。
【问题讨论】:
-
您需要向我们展示 minimal reproducible example - 符合您的数据格式的最小 dict 文字、此数据的预期结果以及您的代码当前返回的输出。
-
字典是无序的,Python解释器的每次运行都会产生一个新的随机哈希种子来防止令人讨厌的DOS攻击(攻击者很容易使你的Python进程过载)。因此,将键与“下一个”键进行比较是行不通的。
-
@MartijnPieters - ...产生了一个新的随机哈希种子来防止令人讨厌的 DOS 攻击... 我想更好地理解这一点。可以提供一些详细解释这一点的资源链接吗?
-
@JasonEstibeiro:请参阅documentation for
object.__hash__()中的框注。 -
我注意到我永远无法比较两个键,这就是我创建键列表和值列表的原因。我必须比较字典键中多次存在的包的版本。
标签: python python-3.x dictionary python-3.5