У меня есть список ключевых слов:
list1 = ['key(1)', 'key(2)' ........, 'key(x)']
И еще 2D список:
list2 = [['key1','str(11)','value(11)'],['key1','str(12)','value(12)'].....,['key(1)','str(1n)','value(1n)'],['key2','str(21)','value(21)'],...,['key(2)','str(2n)','value(2n)'],........., ['key(n)','str(n1)','value(n1)'],...,['key(n)','str(nn)','value(nn)']]
Что я пытаюсь сделать, так это вычислить медиану значений для каждого ключевого слова из списка 1, которое включено в элементы списка 2, и результат будет таким:
output_list=[['key(1)',median(value(11),...value(1n)], ['key(2)',median(value(21),...value(2n)],.....,['key(x)',median(value(x1),...value(xn)]]
Я начал с оператора if:
import statistics
for i in range(0,len(list1)):
for j in range (0,len(list2)):
if list1[i] in list2[j]:
print(list1[i],statistics.median(int(list2[j][2])))
Я пытаюсь напечатать результат, но получаю, что объект «int» не повторяется
Список ключевых слов содержит около 18 тыс. ключевых слов.
median
должен получить итерацию, содержащую все значения для ключа, тогда как вы даете ему только одно значение.
list1 = ["key(1)", "key(2)"]
list2 = [
["key(1)", "str(11)", "11"],
["key(1)", "str(12)", "12"],
["key(1)", "str(1n)", "19"],
["key(2)", "str(21)", "21"],
["key(2)", "str(2n)", "23"],
["key(2)", "str(21)", "21"],
["key(2)", "str(2n)", "253"],
]
import statistics
def values_for_key(searched_list, searched_key):
for key, string, value in searched_list:
if key == searched_key:
yield int(value)
# other solution:
# def values_for_key(searched_list, searched_key):
# return (int(value) for key, string, value in searched_list if key == searched_key)
for key in list1:
print(key, statistics.median(values_for_key(list2, key)))
Как сказано в комментарии, это неэффективный алгоритм, если ваши списки большие, вам следует рассмотреть другой способ их хранения.
Спасибо за помощь. Да, список большой, список ключевых слов содержит около 17 тысяч элементов, поэтому я распечатаю результаты в файл csv.
Какого размера ваши списки? Было бы более эффективно и проще использовать словари, а не списки, поскольку вы последовательно ищете ключ в списке. Это обычно поиск работы для dict. О (п) -> О (1).