grivo (grivo) wrote,
grivo
grivo

python geeks

небольшая заметка для извращенцев.



допустим, что у нас есть некий список, ну или массив - тут уж как кто привык. и он отсортирован паршиво. увы.

fields = ['id', 'order', 'name_ru', 'name_en', 'description_en', 'description_ru' ...... 'x_ru', 'x_en']

а нам надо, чтобы все имена с _ru или _en на конце были отсортированы однообразно. то есть...

fields = ['id', 'order', 'name_ru', 'name_en', 'description_ru', 'description_en' ...... 'x_ru', 'x_en']

import re
from copy import deepcopy

fields = ['id', 'order', 'name_ru', 'name_en', 'description_en', 'description_ru' ...... 'x_ru', 'x_en']
fields_variants = deepcopy(fields)

# подчищаем значения от постфиксов

languages = ['ru', 'en']
regex = r'_(%s)$' % reduce(lambda prev, next: '%s|%s' % (prev, next), languages)
fields = map(lambda field: re.sub(regex, '', field), fields)

# чистим массив от двойных вхождений (можно через методы index и remove
# но там придется использовать try-catch, что расово неверно)

fields_clean = []
while fields:
    field = fields.pop(0)
    if field not in fields_clean:
        fields_clean.append(field)

# теперь у нас есть массив с уникальными "почищенными" данными, причем порядок полей соблюден
# и мы начинаем пересоздавать исходный массив

while fields_clean:
    field = fields_clean.pop(0)
    i18n = False
    for language in languages:
        field_language = '%s_%s' % (field_name, language)
        if field_language in fields_variants:
            i18n = True
            fields.append(field_language)
    if not i18n:
        fields.append(field)
del fields_variants
del fields_clean


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




и напоследок - песенка работающего программиста. да, я примерно щаз как тот самый барбудо - в глазах огонь и все такое.
Tags: life
Subscribe
  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 7 comments