Перемещение многомерной структуры и применение strip () ко всем строкам

Я пытаюсь применить string.strip() ко всем листам, которые являются строками в многомерной коллекции, но мой Python немного ржавый (по меньшей мере). Следующее - лучшее, что я придумал, но я подозреваю, что есть намного лучший способ сделать это.

def strip_spaces( item ):
    if hasattr( item, "__iter__" ):
        if isinstance( item, list ):
            return [strip_spaces( value ) for value in item]
        elif isinstance( item, dict ):
            return dict([(value,strip_spaces(value)) for value in item])
        elif isinstance( item, tuple ):
            return tuple([ strip_spaces( value ) for value in item ])
    elif isinstance( item, str ) or isinstance( item, unicode ):
        item = item.strip()
    return item
11 голосов | спросил Kit Sunde 18 FebruaryEurope/MoscowbFri, 18 Feb 2011 05:52:08 +0300000000amFri, 18 Feb 2011 05:52:08 +030011 2011, 05:52:08

2 ответа


5

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

  • Используйте абстрактные базовые классы в модуле collections для проверки типов уток, таких как «Итерируемый»
  • Используйте types.StringTypes для определения типов строк

.

import collections
import types

def strip_spaces( item ):
    if isinstance( item, types.StringTypes ):
        return item.strip()

    if isinstance( item, collections.Iterable ):
        if isinstance( item, list ):
            return [ strip_spaces( value ) for value in item ]

        elif isinstance( item, dict ):
            return dict([ ((strip_spaces(key), strip_spaces(value)) \
                                    for key, value in item.iteritems() ])

        elif isinstance( item, tuple ):
            return tuple( [ strip_spaces( value ) for value in item ] )

    return item
ответил RobM 19 FebruaryEurope/MoscowbSat, 19 Feb 2011 00:49:51 +0300000000amSat, 19 Feb 2011 00:49:51 +030011 2011, 00:49:51
5
elif isinstance( item, dict ):
    return dict([(value,strip_spaces(value)) for value in item])

Это преобразует { ' a ': ' b ' } в {' a ': 'a' }, который, я подозреваю, не то, что вы хотите. Как насчет:

    return dict([(key, strip_spaces(value)) for key, value in item.items()])
ответил Santa 18 FebruaryEurope/MoscowbFri, 18 Feb 2011 22:44:12 +0300000000pmFri, 18 Feb 2011 22:44:12 +030011 2011, 22:44:12

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132