Frage

I have an object which contains one value and a list. Now I have a list of those objects and want to concatenate all values and lists into one large list.

This is my current state:

class Language:
    def __init__(self, name, code, *args):
        self.name = name
        self.code = code
        self.alt = args
language_list = [Language("Deutsch", "deu", "de", "ger"), 
                 Language("Español", "spa", "es"), 
                 Language("English", "eng", "en"), 
                 Language("Svenska", "swe", "sv"), 
                 Language("Dansk", "dan", "da"), 
                 Language("ﺎﻠﻠﻏﺓ ﺎﻠﻋﺮﺒﻳﺓ", "ara", "ar"), 
                 Language("Italiano", "ita", "it"), 
                 Language("Français", "fra", "fr")]

print([[ lang.code ] + list(lang.alt) for lang in languages_list])

This would return a two dimensional array:

[["deu", "de", "ger"], ["spa", "es"], ["eng", "en"]…

Now is there a way, to either merge that into one large list, or that it basically does [].extend() instead of [].append() on each iteration.

War es hilfreich?

Lösung

Nope, you either have to flatten like this

print([item for lang in languages_list for item in [lang.code] + list(lang.alt)])

Or

from itertools import chain
print([item for lang in languages_list for item in chain([lang.code], lang.alt)])

I would prefer the itertools.chain method, since it doesn't have to create a long list, incase your lang.alt is long.

Andere Tipps

No this is not possible, you have to write a for-loop:

langs = []
for lang in languages_list:
    langs.append(lang.code)
    langs.extend(lang.alt)

The OOP way to achieve this is to define a __str__ and __repr__ method for your class:

class Language(object):

    def __init__(self, name, code, *args):
        self.name = name
        self.code = code
        self.alt = args

    def __str__(self):
        return str(list(tuple([self.code]) + self.alt))

    def __repr__(self):
        return str(list(tuple([self.code]) + self.alt))

This yields:

>>> print Language("Deutsch", "deu", "de", "ger")
['deu', 'de', 'ger']

You can then build on this with a LanguageList class:

class LanguageList(list):

    def __str__(self):
        return str([i for i in self])

Demo:

>>> language_list = LanguageList([Language("Deutsch", "deu", "de", "ger"), 
                                  Language("Español", "spa", "es"), 
                                  Language("English", "eng", "en"), 
                                  Language("Svenska", "swe", "sv")])

>>> print language_list
[['deu', 'de', 'ger'], ['spa', 'es'], ['eng', 'en'], ['swe', 'sv']]
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top