1

我有以下结构:

prev = { 'alpha:10.2': '145', 'teta:180': '198', 'eltira:140': '222', 'ronta:23.14':220}
now = ['alpha:10.3','teta:180', 'eltira:142']

和以下代码:

   old = []
    for k, v in prev.iteritems():
     if k not in now:
       old.append(v)

prev因此,如果在 list 中找不到dict 中的键now,我会将值添加到old列表中。

结果'旧= ['145','222']`

但是,我还想检查哪个部分与键不对应。我倾向于使用namedtuple。

Package = collections.namedtuple('Package', 'name version')

for k, v in prev.items():
  name, version = k.split(':')
  Package(name=k, version='v')
  1. 如果name对应但version不对应,则执行与上述相同的操作。
  2. 如果name找不到将其添加到新列表中old_names,也可以按照上面的方法进行操作。

问题是这if k not in now行不通。我可以用两个循环和三个循环来做到这一点,ifs但也许可以选择让它更干净。

期望输出:

old=[ '145', '222'] old_names=['ronta']

4

3 回答 3

1

我已拆分“现在”列表并将其转换为字典(名称:版本),该字典需要一次迭代。稍后,可以在恒定时间内访问字典中的值以进行进一步的操作。

prev = { 'alpha:10.2': '145', 'teta:180': '198', 'eltira:140': '222', 'old:1. 43':'150'}
now = ['alpha:10.3','teta:180', 'eltira:142']

now_dict = {}
old = []
old_names = []

for items in now:
  temp0,temp1 = items.split(':')
  now_dict[temp0] = temp1

for k,v in prev.items():
   name,version = k.split(':')
   if name not in now_dict.keys():
      old_names.append(name)
      old.append(v)
      continue

   if version != now_dict[name]:
      old.append(v)
      continue

   else:
     continue

if __name__ == '__main__':
  print(old_names)
  print(old)
于 2019-11-07T16:50:53.740 回答
0

您可以通过对它进行ing并将其包装来制作now一个 dict ,然后使用 prev 上的相同方法很容易理解:mapoperator.methodcallerdict()

splitter = operator.methodcaller('split', ':')
now_dict, kv_map = dict(map(splitter, now)), map(splitter, prev)

old = [prev[':'.join((k,v))] for k, v in kv_map if k in now_dict]
old_names = [n for n, v in kv_map if n not in now_dict]

结果:

#old
['145', '198', '222']
#old_names
[]
于 2019-11-07T17:13:02.770 回答
0

这是一种方法:

prev = { 'alpha:10.2': '145', 'teta:180': '198', 'eltira:140': '222', 'zeta:12.1' : '334'}
now = ['alpha:10.3','teta:180', 'eltira:142']

now_splited = [nk.split(":") for nk in now]

old = []
old_name = []
for k, v in prev.items():
    if k not in new_key:
        old_n, old_v = k.split(":")
        name = any(map(lambda n : n[0] == old_n, now_splited))
        version = any(map(lambda n : n[1] == old_v, now_splited))
        if name and not version:
            old.append(v)
        elif not name:
            old_name.append(old_n
            old.append(old_v))

结果 :

>>> print(old, old_name)
['145', '222', '334'] ['zeta']
于 2019-11-07T16:50:21.403 回答