#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']