Фильтрация списка и преобразование

Я нашел .Net Профилировщик Памяти очень хорошая справка при нахождении утечек памяти в.Net. Это не является свободным как Microsoft CLR Profiler, но является быстрее и главным, по-моему.

10
задан Xavier Guihot 27 April 2019 в 15:47
поделиться

7 ответов

Как насчет понимания списка?

In [5]: versions = [m.group(1) for m in [regex.match(lib) for lib in libs] if m] 
In [6]: versions
Out[6]: ['3.3.1', '3.2.0']
19
ответ дан 3 December 2019 в 14:34
поделиться

Еще один однострочник. чтобы показать другие способы (я также немного почистил регулярное выражение):

regex = re.compile(r'^libIce\.so\.([0-9]+\.[0-9]+\.[0-9]+)$')
sum(map(regex.findall, libs), [])

Но учтите, что ваша исходная версия более читабельна, чем все предложения. Стоит ли менять?

8
ответ дан 3 December 2019 в 14:34
поделиться

Вы могли бы сделать это:

versions = [m.group(1) for m in [regex.match(l) for l in libs] if m]

Я не думаю, что это очень удобно для чтения ...

Может быть, это прояснить в два этапа:

matches = [regex.match(l) for l in line]
versions = [m.group(1) for m in matches if m]
5
ответ дан 3 December 2019 в 14:34
поделиться

Нет ничего не питонического в использовании стандартного цикла for. Однако вы можете использовать функцию map () для создания нового списка на основе результатов выполнения функции для каждого элемента в списке.

1
ответ дан 3 December 2019 в 14:34
поделиться

вам действительно не нужно беспокоиться о регулярном выражении для вашего простого случая

>>> libs = ['libIce.so.33', 'libIce.so.3.3.1', 'libIce.so.32', 'libIce.so.3.2.0']
>>> libs
['libIce.so.33', 'libIce.so.3.3.1', 'libIce.so.32', 'libIce.so.3.2.0']
>>> for i in libs:
...   print i.split("so.")
...
['libIce.', '33']
['libIce.', '3.3.1']
['libIce.', '32']
['libIce.', '3.2.0']
>>> for i in libs:
...   print i.split("so.")[-1]
...
33
3.3.1
32
3.2.0
>>>

Выполните дополнительную проверку, чтобы получить те, которые с " точки ».

0
ответ дан 3 December 2019 в 14:34
поделиться

Как насчет этого:

import re

def matches(regexp, list):
    'Regexp, [str] -> Iterable(Match or None)'
    return (regexp.match(s) for s in list)

libs = ['libIce.so.33', 'libIce.so.3.3.1', 'libIce.so.32', 'libIce.so.3.2.0']
regexp = re.compile('libIce.so\.([0-9]+\.[0-9]+\.[0-9]+)')
versions = [m.group(1) for m in matches(regexp, libs) if m is not None]

>>> print versions
['3.3.1', '3.2.0']
0
ответ дан 3 December 2019 в 14:34
поделиться

Один из способов, который я мог придумать, - это объединить "карту" и понимание списка.
Решение выглядит следующим образом:

import re  
libs = ['libIce.so.33', 'libIce.so.3.3.1', 'libIce.so.32', 'libIce.so.3.2.0']  
versions = []  

regex = re.compile('libIce.so\.([0-9]+\.[0-9]+\.[0-9]+)')  

def match(s):  
    m = regex.match(s)  
    if m:  
        return m.group(1)  

versions = [x for x in map(match,libs) if x]  

0
ответ дан 3 December 2019 в 14:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: