2013-06-18 2 views
0

У меня есть два списка целых чисел: напримерСвязывание двух связанных списков разной длины питона

a = [ 008, 016, 024... ] 

b = [001, 002, 002, 003... 012, 016] 

Списка инкрементируется последовательно по 8, а список б больше случайных (например, иногда два записанных Интсов).

Суть в том, что я хочу сделать, - это связать эти два бита, так что [i] = b [i] < = a [i + 1] прилагается к такому?

Так я хотел бы получить от Ъ:

c = [ 008, 008, 008, 008 ... 016, 016] 

Хотелось бы надеяться, что имеет смысл?

+3

Прошу прощения, но я не понимаю ваш вопрос. Вы хотите создать 'dict' с ограничениями на' a' и 'b', но вы укажете' c' как примерное решение, которое является списком. Не могли бы вы повторить проблему? –

+0

Похоже, вы пытаетесь создать список, содержащий индекс в 'b' каждого значения в' a'. Или что-то подобное этому. Это правильно? – wberry

ответ

0

Я предполагаю, что вы ищете что-то вроде этого:

>>> a = [ 8, 16, 24, 32 ] 
>>> b = [1, 2, 2, 3, 12, 16] 
>>> [a[0] if a[0] < x and [a.pop(0)] else a[0] for x in b ] 
[8, 8, 8, 8, 16, 16] 

Использования collections.deque:

>>> from collections import deque 
>>> d = deque(a) 
>>> [d[0] if d[0] < x and [d.popleft()] else d[0] for x in b ] 
[8, 8, 8, 8, 16, 16] 

гораздо чтений состояния версии:

>>> it = iter(a) 
>>> prev = next(it) 
>>> result = [] 
for x in b: 
    if x <= prev: 
     result.append(prev) 
    else: 
     prev = next(it) 
     result.append(prev) 
...   
>>> result 
[8, 8, 8, 8, 16, 16] 
+3

Это изменит 'a', не так ли? – 2rs2ts

+0

Ну, он никогда не говорил, что хочет держать '' ':-)' – wberry

+0

@ 2rs2ts да, но мы можем сохранить копию 'a'. Здесь не проблема. :) –

0

Как генератор:

def make_c(a, b): 
    a_idx = 0 
    for elt in b: 
     # while loop can be replaced with "if" 
     # as long as jumps in b never skip elements in a 
     while elt > a[a_idx]: 
      a_idx += 1 
     yield a[a_idx] 
Смежные вопросы