Reputation: 2379
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.
Upvotes: 2
Views: 99
Reputation: 85805
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']]
Upvotes: 0
Reputation: 42758
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)
Upvotes: 0
Reputation: 239483
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.
Upvotes: 3