首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >字典处理列表.可读性和复杂性

字典处理列表.可读性和复杂性
EN

Stack Overflow用户
提问于 2017-09-25 20:58:19
回答 4查看 87关注 0票数 0

我有关于理解的基本问题。有值为列表的dicts列表,如下所示:

代码语言:javascript
复制
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/文件夹/和下一个/之间。我所做的:

代码语言:javascript
复制
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]))

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

代码语言:javascript
复制
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]))

关于理解的大小有什么金科玉律(如蟒蛇的禅)吗?我怎样才能让它变得更好?提前谢谢你。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-09-25 21:17:26

我怎样才能让它变得更好?

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

以下是我要分析的最后两点..。

代码语言:javascript
复制
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)
票数 1
EN

Stack Overflow用户

发布于 2017-09-25 21:04:59

你可以试试这个:

代码语言:javascript
复制
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])))

输出:

代码语言:javascript
复制
['hog', 'hog-00', 'cow', 'dog_111', 'dog', 'cat', 'ant', 'hen']
票数 0
EN

Stack Overflow用户

发布于 2017-09-25 21:06:45

您可以通过添加换行符和缩进来提高其可读性。我停止使用item for sublist...,因为我不理解代码逻辑,但可以假定您可以在其中添加更多的新行。

代码语言:javascript
复制
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
    ])
)

话虽如此,我认为这样的东西更容易读懂:

代码语言:javascript
复制
def animal_name_from_path(path):
    return re.search('folder/([a-z]+)', path).group(1)

def is_animal_path(path):
    return '/tmp' in path

def deduplicate(L):
    return list(set(L))

path_list = []
for item in listionary:
    path_list.extend(item['path'])

animals = deduplicate([animal_name_from_path(path) for path in path_list if is_animal_path(path)])

这里应用的一个经验法则是,任何概念都应该有一个名称。在您的原始代码中,item for sublist in [i['path'] for i in listionary] for item in sublist很难理解,因为不清楚itemi应该是什么。在这个新的块中,更清楚的是,您只是在简化路径列表。一旦所有概念都被命名,动物名称识别代码就更容易理解了。在这里,我可能已经到了一个极端-你可以找到你自己的快乐平衡,你发现最可读的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46414075

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档