处理可读性和复杂性的词典列表

2024-09-29 06:30:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个关于理解的基本问题。 有一个dict列表,其中值是列表,如下所示:

listionary = [{'path': ['/tmp/folder/cat/number/letter', '/tmp/folder/hog/char/number/letter', '/tmp/folder/hog/number/letter', '/etc'], 
'mask': True, 
'name': 'dict-1'}, 
{'path': ['/tmp/folder/dog/number-2/letter-4', '/tmp/folder/hog-00/char/number-1/letter-5', '/tmp/folder/cow/number-2/letter-3'], 
'mask': True, 
'name': 'dict-2'}, 
{'path': ['/tmp/folder/dog_111/number/letter', '/tmp/folder/ant/char/number/letter', '/tmp/folder/hen/number/letter'], 
'mask': True, 
'name': 'dict-3'}]

我需要的是从每个独特的动物的列表类型值。 动物总是在tmp/folder/和下一个/之间。 我所做的:

import re
flat_list = [item for sublist in [i['path'] for i in listionary] for item in sublist]
animals = list(set([re.search('folder/([a-z]+)', elem).group(1) for elem in flat_list if 'tmp' in elem]))

它也可以压缩成一行,但它非常复杂且不可读:

animals = list(set([re.search('folder/([a-z]+)', elem).group(1) for elem in [item for sublist in [i['path'] for i in listionary] for item in sublist] if 'tmp' in elem]))

关于理解力的大小有什么黄金法则吗(例如python的禅)? 我怎样才能做得更好?先谢谢你。你知道吗


Tags: pathinnumber列表forfolderitemtmp
3条回答

缩短的解决方案:

animals = set(re.search(r'/folder/([a-z]+)', p).group(1) for d in listionary for p in d['path'] if '/tmp' in p)
print(animals)

输出:

{'hog', 'cat', 'dog', 'cow', 'hen', 'ant'}

你可以试试这个:

listionary = [{'path': ['/tmp/folder/cat/number/letter', '/tmp/folder/hog/char/number/letter', '/tmp/folder/hog/number/letter', '/etc'], 
'mask': True, 
'name': 'dict-1'}, 
 {'path': ['/tmp/folder/dog/number-2/letter-4', '/tmp/folder/hog-00/char/number-1/letter-5', '/tmp/folder/cow/number-2/letter-3'], 
'mask': True, 
'name': 'dict-2'}, 
{'path': ['/tmp/folder/dog_111/number/letter', '/tmp/folder/ant/char/number/letter', '/tmp/folder/hen/number/letter'], 
'mask': True, 
'name': 'dict-3'}]
import re
from itertools import chain
animals = list(set(chain.from_iterable([[re.findall("/tmp/folder/(.*?)/", b)[0] for b in i["path"] if re.findall("/tmp/folder/(.*?)/", b)] for i in listionary])))

输出:

['hog', 'hog-00', 'cow', 'dog_111', 'dog', 'cat', 'ant', 'hen']

我怎样才能做得更好?

  1. 让别人读一下。
  2. 使用函数来封装更复杂的操作
  3. 不要在同一行嵌套循环

下面是我将如何分解最后两点。。你知道吗

def get_animals(d):
    animals = []
    for item in d['path']:
        if item.startswith('/tmp/folder/'):
            animals.append(item[12:item.find('/',12)])
    return animals

animals = set()
for d in dlist:
    animals.update(get_animals(d))
animals = list(animals)

相关问题 更多 >