Соединяйте соседние элементы списка до тех пор, пока в Python выполняется условие

#python #python-3.x #list

Вопрос:

У меня есть два списка

 list1 = [577, 553, 613, 673, 773, 827, 923, 963, 993, 1049, 1117, 1153, 1173, 1183]
list2 = ['Al,', 'Alan', 'Latin', 'Amer', '2', 'P', '1', 'vo', '|', '1', 't', '|', '2', 'Avg']
 

Если разница между соседними элементами list1 равна

Вывод такой

 ['Al, Alan Latin Amer', '2 P', '1 vo | 1 | 2 Avg']
 

Я попробовал нижеприведенную логику, но она просто объединяет только два элемента

 for i in list2:
    indx_val = list2.index(i)
    if indx_val !=0:
        if list1[indx_val] - list1[indx_val-1] < 75:
            list2[indx_val - 1] = list2[indx_val -1]  ' '  list2[indx_val]
            list1.pop(indx_val)
            list2.pop(indx_val)
 

И выдавать результат в виде

 ['Al, Alan', 'Latin Amer', '2 P', '1 vo', '| 1', 't |', '2 Avg']
 

не могли бы вы, пожалуйста, помочь мне получить результат, как показано ниже?, Заранее спасибо

 ['Al, Alan Latin Amer', '2 P', '1 vo | 1 | 2 Avg']
 

Ответ №1:

Путем зацикливания list1 :

 list1 = [577, 553, 613, 673, 773, 827, 923, 963, 993, 1049, 1117, 1153, 1173, 1183]
list2 = ['Al,', 'Alan', 'Latin', 'Amer', '2', 'P', '1', 'vo', '|', '1', 't', '|', '2', 'Avg']
res = [list2[0]]

for i in range(1, len(list1)):
    if abs(list1[i] - list1[i-1]) < 75:
        res[-1] = res[-1] " "   list2[i]
    else:
        res.append(list2[i])

print(res)
 

выход:

 ['Al, Alan Latin Amer', '2 P', '1 vo | 1 t | 2 Avg']
 

Ответ №2:

Вы могли бы попробовать это для цикла:

 newlist = []
s = list2[0]   ' '
for i, (x, y) in enumerate(zip(list1, list1[1:])):
    if (y - x) < 75:
        s  = list2[i   1]   ' '
    else:
        newlist.append(s.rstrip())
        s = list2[i   1]   ' '
newlist.append(s.rstrip())
print(newlist)
 

Выход:

 ['Al, Alan Latin Amer', '2 P', '1 vo | 1 t | 2 Avg']
 

Ответ №3:

Вы можете продолжать перебирать элементы до тех пор, пока абсолютная разница между соседними элементами не станет меньше 75; Если это не так, добавьте подсписок, который удовлетворяет нашему ограничению.

 list1 = [577, 553, 613, 673, 773, 827, 923, 963, 993, 1049, 1117, 1153, 1173, 1183]
list2 = ['Al,', 'Alan', 'Latin', 'Amer', '2', 'P', '1', 'vo', '|', '1', 't', '|', '2', 'Avg']

result = []

i = 0
while i < len(list1):
    j = i
    while j < len(list1) and abs(list1[j] - list1[i]) < 75:
        j  = 1
    result.append(" ".join(list2[i:j 1]))
    i = j

print(result)
 

Выход: ['Al, Alan Latin Amer', 'Amer 2', '2 P 1', '1 vo | 1', '1 t |', '| 2 Avg']

Ответ №4:

При условии, что оба списка имеют одинаковую длину… zip их

 diff = [j-i for i, j in zip(list1[:-1], list1[1:])]
output = [list2[0]]

for d, s in zip(diff, list2[1:]):
   if d <75:
      output[-1] = f'{output[-1]}  {s}'
   else:
      output  = [s]

print(output)
 

Выход

 ['Al,  Alan  Latin  Amer', '2  P', '1  vo  |  1  t  |  2  Avg']
 

Ответ №5:

Попробуйте это:

 list1 = [577, 553, 613, 673, 773, 827, 923, 963, 993, 1049, 1117, 1153, 1173, 1183]
list2 = ['Al,', 'Alan', 'Latin', 'Amer', '2', 'P', '1', 'vo', '|', '1', 't', '|', '2', 'Avg']

indices=[0] [i for i in range(1,len(list1)) if list1[i]-list1[i-1]>75] [len(list2)] #====  Detect where the difference is >75. Add [0] and [len(list)] as the first and the last index to slice

list3=[' '.join(list2[indices[i]:indices[i 1]]) for i in range(len(indices)-1)]
print(list3) #==== Join list slices
 

Ответ №6:

Вы можете выполнить итерацию list1 , чтобы найти индексы среза. Используется zip для перебора пар каждого значения и следующего значения

 indices = []
for (x, y, i) in zip(list1, list1[1:], range(len(list1))):
    if abs(x - y) > 75:
        indices.append(i   1)
print(indices) # [4, 6]
 

После этого вы можете использовать эти индексы для среза list2

 result = []
for start, end in zip([0]   indices, indices   [len(list2)]):
    result.append(' '.join(list2[start:end]))
print(result) # ['Al, Alan Latin Amer', '2 P', '1 vo | 1 t | 2 Avg']
 

С пониманием списка

 indices = [i   1 for (x, y, i) in zip(list1, list1[1:], range(len(list1))) if abs(x - y) > 75]
result = [' '.join(list2[start:end]) for start, end in zip([0]   indices, indices   [len(list2)])]
 

Ответ №7:

В качестве упражнения я попытался решить проблему с помощью сокращения. наконец, это не очень читабельное, но, возможно, самое быстрое решение

 from functools import reduce
list1 = [577, 553, 613, 673, 773, 827, 923, 963, 993, 1049, 1117, 1153, 1173, 1183]
list2 = ['Al,', 'Alan', 'Latin', 'Amer', '2', 'P', '1', 'vo', '|', '1', 't', '|', '2', 'Avg']

def r(prev,curr):
    #print(prev,curr)
    
    prev_val, ret = prev
    cur_val, key = curr
    if prev_val is None:
        ret =  [[key]]
    elif abs(cur_val-prev_val)<75:
        ret[-1].append(key)
    else:
        ret.append([key])
    return cur_val, ret
        
    
[' '.join(x) for x in reduce( r, zip(list1,list2), (None,None))[1]]

#['Al, Alan Latin Amer', '2 P', '1 vo | 1 t | 2 Avg']