Есть ли лучший способ для создания списков, как это? - PullRequest
3 голосов
/ 15 декабря 2010

Я новичок в Python и мне это нравится, но мне было интересно, есть ли лучший способ сделать пару манипуляций со списком.

Это относительно вменяемое, но, похоже, я мог пропустить встроенную функцию.

def zip_plus(source_list, additional_list):
    """
    Like zip but does plus operation where zip makes a tuple

    >>> a = []
    >>> zip_plus(a, [[1, 2], [3, 4]])
    >>> a
    [[1, 2], [3, 4]]
    >>> zip_plus(a, [[11, 12], [13, 14]])
    >>> a
    [[1, 2, 11, 12], [3, 4, 13, 14]]
    """
    if source_list:
        for i, v in enumerate(additional_list):
            source_list[i] += v
    else:
        source_list.extend(additional_list)

Эта хакерская и сложная для чтения, любые идеи по ее чистотеили еще питоник?

def zip_join2(source_list, additional_list):
    """
    Pretty gross and specialized function to combine 2 types of lists of things,
    specifically a list of tuples of something, list
    of which the something is left untouched

    >>> a = []
    >>> zip_join2(a, [(5, [1, 2]), (6, [3, 4])])
    >>> a
    [(5, [1, 2]), (6, [3, 4])]
    >>> zip_join2(a, [(5, [11, 12]), (6, [13, 14])])
    >>> a
    [(5, [1, 2, 11, 12]), (6, [3, 4, 13, 14])]
    """
    if source_list:
        for i, v in enumerate(additional_list):
            source_list[i] = (source_list[i][0], source_list[i][1] + v[1])
    else:
        source_list.extend(additional_list)

Ответы [ 4 ]

4 голосов
/ 15 декабря 2010
def zip_plus(first, second):
    return [x+y for (x,y) in zip(first, second)]

def zip_join2(first, second):
    return [(x[0], x[1]+y[1]) for (x,y) in zip(first, second)]
3 голосов
/ 15 декабря 2010

Во-первых, чтобы быть более Pythonic, я бы избегал изменяющихся входных данных.

Во-вторых, вы, вероятно, хотите что-то более похожее на dict вместо списка кортежей для вашей функции zip_join2.Например:

>>> a = {5 : [1,2], 6 : [3,4]}
>>> b = {5 : [11,12], 6 : [13,14]}
>>> for k,v in b.iteritems():
...     a[k].extend(v)
>>> a = {5: [1,2,11,12], 6: [3,4,13,14]}

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

1 голос
/ 15 декабря 2010

Понимание списка с использованием распаковки кортежей и логической логики.

zip_plus:

from itertools import izip_longest
def zip_plus(first, second):
    return [(a or []) + (b or []) for a, b in izip_longest(first, second)]

print zip_plus([], [[1, 2], [3, 4]])
print zip_plus([[1, 2], [3, 4]], [[11, 12], [13, 14]])
print zip_plus([[1, 2], [3, 4]], [[11, 12]])
print zip_plus([[1, 2]], [[11, 12], [13, 14]])

zip_join2:

from itertools import izip_longest
def zip_join2(first, second):
    return [(a or c or 0, (b or []) + (d or [])) for (a, b), (c, d) in \
              izip_longest(first, second, fillvalue=(None, None))]

print zip_join2([], [(5, [1, 2]), (6, [3, 4])])
print zip_join2([(5, [1, 2]), (6, [3, 4])], [(5, [11, 12]), (6, [13, 14])])

0 охватывает случай, когда a равно 0, а c равно None.Отчасти это заставляет меня тоже съеживаться.

1 голос
/ 15 декабря 2010
def zip_plus(source_list, additional_list):
  return map(lambda a, b: a + b if a and b else a or b, source_list, additional_list)

def zip_join2(source_list, additional_list):
  return map(lambda x, y: (x[0], x[1] + y[1]), source_list, additional_list)

карта работает параллельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...