我具有以下结构:
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')
name
对应但version
不对应,请执行上述相同的操作。 name
,请将其添加到新列表old_names
中,也可以按照上述操作进行。问题是if k not in now
无法正常工作。我可以用两个循环和三个ifs
来做到这一点,但是也许有一个选择可以使它更干净。
期望输出:
old=[ '145', '222']
old_names=['ronta']
答案 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)
您可以通过now
将map
放入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;
}