welches ist wohl die einfachste Möglichkeit, das erste Element eines iterierbaren Objektes zu erhalten?
Code: Alles auswählen
for element in iterable:
return element
Code: Alles auswählen
for element in iterable:
return element
Code: Alles auswählen
element = next(iter(iterable))
Code: Alles auswählen
list(iterable)[0]
Schau dir nochmal die Klammersetzung an. Das `None` gehoert zu `next`, nich `iter`.mutetella hat geschrieben:@lunar
'sentinel' bringt mir an der Stelle aber nichts, ich möchte ja ohne jedwede Prüfung einfach nur das 1. Element eines Iterators...
Oder verstehe ich das falsch?
Code: Alles auswählen
In [3]: next(iter([]))
---------------------------------------------------------------------------
StopIteration Traceback (most recent call last)
/home/cofi/<ipython console> in <module>()
StopIteration:
In [4]: next(iter([]), None)
Code: Alles auswählen
class OneItemList(list):
def __init__(self, iterable=None):
if iterable is not None:
self.append(next(iter(iterable), None))
def append(self, item):
self[:] = iter((item,))
def extend(self, item):
self[:] = iter((item,))
Code: Alles auswählen
...
def extend(self, iterable):
self.append(next(iter(iterable), None))
Code: Alles auswählen
import collections
class OneItemList(list):
def __init__(self, iterable=None):
if iterable is not None:
self.append(next(iter(iterable), None))
def append(self, item):
self[:] = [item]
def extend(self, iterable):
self.append(next(iter(iterable), None))
class PatternFactory(object):
def __init__(self):
self._stock = {}
def add_collection(self, name, multiple=True, operators=True):
if multiple:
list_ = list
else:
list_ = OneItemList
self._stock[name] = {}
if operators:
self._stock[name]['pattern'] = collections.defaultdict(list_)
else:
self._stock[name]['pattern'] = list_()
self._stock[name]['operators'] = operators
def switch(self, name, value, operator_=None):
operator_ = operator_ or 'and_'
if self._stock[name]['operators']:
pattern = self._stock[name]['pattern'][operator_]
else:
pattern = self._stock[name]['pattern']
if value in pattern:
pattern.remove(value)
else:
pattern.append(value)
def _pattern(self):
pattern = {}
for name, value in self._stock.iteritems():
if self._stock[name]['operators']:
values = self._stock[name]['pattern'].values()
else:
values = self._stock[name]['pattern']
if any(values):
pattern[name] = value['pattern']
return pattern
pattern = property(_pattern)
Code: Alles auswählen
In [40]: p = pattern.PatternFactory()
In [41]: p.add_collection('OnlyOneNumber', multiple=False, operators=False)
In [42]: p.switch('OnlyOneNumber', 1)
In [43]: p.pattern
Out[43]: {'OnlyOneNumber': [1]}
In [44]: p.switch('OnlyOneNumber', 2)
In [45]: p.pattern
Out[45]: {'OnlyOneNumber': [2]}
In [46]: p.switch('OnlyOneNumber', 2)
In [47]: p.pattern
Out[47]: {}