对于字典,将键和值与列表中的值进行比较

时间:2019-11-07 16:28:50

标签: python list python-2.7 dictionary

我具有以下结构:

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中找不到字典now的密钥,则将值添加到old列表中。

结果'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']

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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']

答案 2 :(得分:0)

您可以通过nowmap放入operator.methodcaller并将其包装在dict()中来使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] 成为字典,然后使用与上一条相同的方法进行理解很容易:< / p>

#old
['145', '198', '222']
#old_names
[]

结果:

 function GetYouTubeId($url)
 {
 preg_match('%(?:youtube(?:-nocookie)?\.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu\.be/)([^"&?/ ]{11})%i', $url, $match);
 $youtube_id = $match[1];
 return $youtube_id;
 }
相关问题