У меня есть список, который содержит несколько списков внутри него, и он выглядит так:
my_list = [
['Morocco', 'Fish', '0,012'],
['Morocco', 'Fish', '0,153'],
['Morocco', 'Fish', '0,114'],
['Morocco', 'Fish', '0,109'],
['Morocco', 'Fish', '0,252'],
['Spain', 'Fish', '0,012'],
['Spain', 'Fish', '0,113'],
['Spain', 'Fish', '0,116'],
['Spain', 'Fish', '0,250'],
['Spain', 'Fish', '0,266'],
['Italy', 'Fish', '0,112'],
['Italy', 'Fish', '0,025'],
['Italy', 'Fish', '0,224'],
['Italy', 'Fish', '0,256'],
['Italy', 'Fish', '0,245']]
И у меня есть переменная, которая выглядит так:
my_limit = 0.2
Теперь для каждого списка я хочу получить последнее значение до того, как оно превысит my_limit
. Я хочу, чтобы это значение сохранялось в новой переменной.
Вот что я пробовал:
for l in my_list:
if row[-1] #<-- this is actually where I block.... I dont know how to fix it.
Это результат, который я ожидаю:
0,109
0,116
0,025
@wjandrea, этот ответ меня смущает. Мне не нужно преобразовывать какие-либо числа... или преобразовывать строку с числом с плавающей запятой.....
@TangerCity Вам нужно, так как числа в вашем массиве имеют запятую '0,012'
.
Да, вы делаете ... Вам нужно получить значения, такие как '0,012'
, в числа с плавающей запятой, а встроенная функция этого не сделает: float('0,012')
-> ValueError: could not convert string to float: '0,012'
Хорошо, но преобразование их в числа с плавающей запятой — это только половина проблемы, не так ли?
@Tanger Да, именно поэтому я оставил комментарий вместо ответа.
Какой результат вы ожидаете от такой последовательности, как "0,110", "0,256", "0,196"
с пределом 0.2
? Просто чтобы дважды проверить, хотите ли вы получить результат на основе позиции или на основе значения.
Это просто вопрос перебора списка и сообщения list[n-1]
когда list[n]>my_limit
.
Вам нужно будет расширить это, чтобы справиться с крайними случаями (т.е. это приведет к ошибке, если первое значение превышает предел и т. д.).
И вы можете разделить свой список на один список для каждого товара, так как это будет срабатывать при изменении товаров.
my_limit = 0.2
for n in range(1, len(my_list)):
value = float(my_list[n][2].replace(",", "."))
prev_value = float(my_list[n-1][2].replace(",", "."))
if value > my_limit and prev_value < my_limit:
print(my_list[n-1])
@что означает [2]
в твоем третьем ряду?
Это позиция цены в вашем подсписке.
попробуй print(my_list[1])
и print(my_list[1][2])
и увидишь.
Ах, ваш код - аккуратные мужчины. Отлично, спасибо. Если бы вы могли просто добавить некоторые комментарии в нем. Я не понимаю, что вы сделали, например, в prev_value...
Еще один момент, я получаю в результате весь список, а не только цифры, которые стоят перед my_limist
.. Как это?
Если вы просто измените его на range(1, len(my_list))
, вы избежите ошибки с первым значением.
для этого вы можете использовать модуль itertools
>>> import itertools
>>> my_list = [
['Morocco', 'Fish', '0,012'],
['Morocco', 'Fish', '0,153'],
['Morocco', 'Fish', '0,114'],
['Morocco', 'Fish', '0,109'],
['Morocco', 'Fish', '0,252'],
['Spain', 'Fish', '0,012'],
['Spain', 'Fish', '0,113'],
['Spain', 'Fish', '0,116'],
['Spain', 'Fish', '0,250'],
['Spain', 'Fish', '0,266'],
['Italy', 'Fish', '0,112'],
['Italy', 'Fish', '0,025'],
['Italy', 'Fish', '0,224'],
['Italy', 'Fish', '0,256'],
['Italy', 'Fish', '0,245']]
>>> my_limit = 0.2
>>> for key,sublists in itertools.groupby(my_list,lambda y:y[0]):
v=[] #we initialize it in case no element fulfill the condition
for v in itertools.takewhile(lambda x:float(x[-1].replace(",","."))<my_limit ,sublists):
pass
if v:
print(v,"->",v[-1])
['Morocco', 'Fish', '0,109'] -> 0,109
['Spain', 'Fish', '0,116'] -> 0,116
['Italy', 'Fish', '0,025'] -> 0,025
>>>
здесь с помощью groupby мы, ну, группируем вместе все последовательные подсписки, которые имеют одинаковое значение в заданной позиции, которую мы указываем, которая в данном случае является первой позицией, затем мы идем в те подсписки и берем те, которые удовлетворяют нашему условию и остановимся на первом, который не соответствует takewhile, а из тех нам нужен только последний, который будет сохранен в v
в конце цикла.
Я делаю эту группировку, потому что это имеет больше смысла для меня, но если такая группировка не нужна, мы также можем использовать groupby, чтобы разделить список на подразделы, которые удовлетворяют условию, и те, которые не соответствуют, путем изменения ключа группировки
>>> my_list = [
['Morocco', 'Fish', '0,012'],
['Morocco', 'Fish', '0,153'],
['Morocco', 'Fish', '0,114'],
['Morocco', 'Fish', '0,109'],
['Morocco', 'Fish', '0,252'],
['Morocco', 'Fish', '0,002'],#extra
['Morocco', 'Fish', '0,252'],#extra
['Spain', 'Fish', '0,012'],
['Spain', 'Fish', '0,113'],
['Spain', 'Fish', '0,116'],
['Spain', 'Fish', '0,250'],
['Spain', 'Fish', '0,266'],
['Spain', 'Fish', '0,066'], #extra
['Spain', 'Fish', '0,366'], #extra
['Italy', 'Fish', '0,112'],
['Italy', 'Fish', '0,025'],
['Italy', 'Fish', '0,224'],
['Italy', 'Fish', '0,256'],
['Italy', 'Fish', '0,245'],
['Italy', 'Fish', '0,005'],#extra
['Italy', 'Fish', '0,305']]#extra
>>> for condition,sublist in itertools.groupby(my_list,lambda x:float(x[-1].replace(",","."))<my_limit):
if condition:
for v in sublist:
pass
print(v,"->",v[-1])
['Morocco', 'Fish', '0,109'] -> 0,109
['Morocco', 'Fish', '0,002'] -> 0,002
['Spain', 'Fish', '0,116'] -> 0,116
['Spain', 'Fish', '0,066'] -> 0,066
['Italy', 'Fish', '0,025'] -> 0,025
['Italy', 'Fish', '0,005'] -> 0,005
>>>
См. этот ответ, чтобы узнать, как выполнить преобразование номеров с учетом локали.