Как объединить каждый из элементов двух списков в Python? - PullRequest
5 голосов
/ 04 декабря 2011

У меня есть огромная группа списков в списках, которые я хочу объединить: Это выглядит примерно так:

[[1,2,3,4,5], [6,7,8,9,0], [2,5,7,9,4], [4,7,8,43,6]...]

до 20 из этих списков в списке. Теперь я хочу объединить первый и второй список, чтобы они выглядели так:

[[1,6], [2,7], [3,8], [4,9], [5,0]]

А потом я хочу сделать это снова с 1-м и 3-м, вплоть до конца. И затем сделайте это снова, начиная со второго списка до 3-й, 4-й ... последней строки (но не первой, потому что это уже было сделано с 1-го по 2-й список). Как я могу написать код, который будет делать это?

Вот что у меня есть:

xcols = столбец со всеми списками, как я показал выше

def MakeLists(xcols):
    multilist = []
    for i in xcols:
        for j in xcols[index(i):]:
            currentlist = map(list.__add__, i, j)
            multilist.append(currentlist)

Дает мне ошибку при запуске, хотя, вероятно, в части карты, потому что я не знаю, как сначала преобразовать каждый элемент в список, а затем отобразить их. Любая помощь будет отличной. Спасибо!

Ответы [ 5 ]

4 голосов
/ 04 декабря 2011

Примерно так:

>>> import itertools
>>> foo = [[1, 2, 3], [4, 5, 6], [7, 8, 8]]
>>> for p in itertools.permutations(foo, 2):
...     print zip(*p)
... 
[(1, 4), (2, 5), (3, 6)]
[(1, 7), (2, 8), (3, 8)]
[(4, 1), (5, 2), (6, 3)]
[(4, 7), (5, 8), (6, 8)]
[(7, 1), (8, 2), (8, 3)]
[(7, 4), (8, 5), (8, 6)]

Редактировать: В случае, если вы хотите сжать список только с теми, что после него, как объясняют люди в комментариях:

>>> import itertools
>>> for p in itertools.combinations(foo, 2):
...     print zip(*p)
... 
[(1, 4), (2, 5), (3, 6)]
[(1, 7), (2, 8), (3, 8)]
[(4, 7), (5, 8), (6, 8)]
2 голосов
/ 04 декабря 2011
a=[[1,2,3,4,5],[6,7,8,9,0],[2,5,7,9,4],[4,7,8,43,6]]

i=0

for l in a[i:]:
    for inner in a[i+1:]:
        print [list(b) for b in zip(l, inner)]
    i += 1

печать

[[1, 6], [2, 7], [3, 8], [4, 9], [5, 0]]
[[1, 2], [2, 5], [3, 7], [4, 9], [5, 4]]
[[1, 4], [2, 7], [3, 8], [4, 43], [5, 6]]
[[6, 2], [7, 5], [8, 7], [9, 9], [0, 4]]
[[6, 4], [7, 7], [8, 8], [9, 43], [0, 6]]
[[2, 4], [5, 7], [7, 8], [9, 43], [4, 6]]
1 голос
/ 04 декабря 2011

Самое короткое решение (lsts - это список ваших списков):

[zip(lsts[i],lsts[j]) for i in xrange(len(lsts)) for j in xrange(i,len(lsts)) if i!=j]

Он сделает именно то, что вы сказали. Попробуйте это.

Это то, что вы ожидали?

1 голос
/ 04 декабря 2011

Вы сможете достичь желаемого результата, только если у вас есть четное количество списков.Этот код даст ожидаемый результат.Однако может быть что-то более «питоническое».

foo = [[1,2,3,4,5],[6,7,8,9,0],[2,5,7,9,4],[4,7,8,43,6]]
newlist = []

for i in xrange(len(foo)):
    if i % 2 == 0:
        list1 = foo[i]
        list2 = foo[i + 1]
        for n in xrange(len(list1)):
            newlist.append([list1[n],list2[n]])

print newlist

Результат:

[[1, 6], [2, 7], [3, 8], [4, 9], [5, 0], [2, 4], [5, 7], [7, 8], [9, 43], [4, 6]]
1 голос
/ 04 декабря 2011
def foo(li):
  for element in li[1:]:
    for pair in zip(li[0], element): 
      yield pair

>>> from test import foo
>>> bar = [[1, 2, 3, 5, 6], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15]]
>>> foo(bar)
<generator object foo at 0x10592df50>
>>> [e for e in foo(bar)]
[(1, 6), (2, 7), (3, 8), (5, 9), (6, 10), (1, 11), (2, 12), (3, 13), (5, 14), (6, 15)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...