Подтвердить что ты не робот

Pythonic Way для создания объединения всех значений, содержащихся в нескольких списках

Выполнение обработки XML в python. (Edit: я вынужден использовать Python 2.4 для этого проекта, boo!) Я хочу знать, что такое самый Pythonic способ сделать это (создать объединение всех значений в нескольких списках):

def getUniqueAttributeValues(xml_attribute_nodes):
    # split attribute values by whitespace into lists
    result_lists=list(item.getContent().split() for item in xml_attribute_nodes)

    # find all unique values
    unique_results=[]
    for result_list in result_lists:
        for result in result_list:
            if result in unique_results:
                continue
            unique_results.append(result)

    return unique_results
4b9b3361

Ответ 1

set.union делает то, что вы хотите:

>>> results_list = [[1,2,3], [1,2,4]]
>>> results_union = set().union(*results_list)
>>> print results_union
set([1, 2, 3, 4])

Вы также можете сделать это с более чем двумя списками.

Ответ 2

Так как вы, кажется, используете Python 2.5 (он был бы хорошо упоминать в вашем Q, если вам нужен A для версий!= 2.6, текущий производственный, кстати;-) и в результате я хочу получить список, а не набор, я рекомендую:

   import itertools

   ...

   return list(set(itertools.chain(*result_list)))

itertools, как правило, отличный способ работать с итераторами (и, следовательно, с множеством последовательностей или коллекций), и я сердечно рекомендую вам познакомиться с ним. itertools.chain, в частности, документируется здесь.

Ответ 3

Союзы не поддерживаются списками, которые упорядочены, но поддерживаются наборами. Проверьте set.union.

Ответ 4

Я использовал следующее, чтобы выполнить пересечения, что позволяет избежать необходимости в наборах.

a, b= [[1,2,3], [1,2]]
s = filter( lambda x: x in b, a)

или,

s = [ x for x in b if x in a ]

Ответ 5

def getUniqueAttributeValues(xml_attribute_nodes):
    return set(l 
       for item in xml_attribute_nodes
       for l in item.getContent().split())

Если вы хотите иметь список, просто верните его в список перед возвратом.

Ответ 6

Вы также можете следовать этому стилю

In [12]: a = ['Orange and Banana', 'Orange Banana']
In [13]: b = ['Grapes', 'Orange Banana']
In [14]: c = ['Foobanana', 'Orange and Banana']

In [20]: list(set(a) | set(b) | set(c))
Out[20]: ['Orange and Banana', 'Foobanana', 'Orange Banana', 'Grapes']

In [21]: list(set(a) & set(b) | set(c))
Out[21]: ['Orange and Banana', 'Foobanana', 'Orange Banana']