如何在 Python 中通过 itertools 函数使用索引
How to use index with the itertools function in Python
我有一个列表,其中包含多个列表,它看起来像这样:
import itertools
stand_city = 11
stand_liverpool = 6.5
premier_league = [
['A1','Manchester City', '10,1', 'Aguero'],
['A2','Manchester City', '11,2', 'Mahrez'],
['A3','Manchester City', '13,5', 'Sterling'],
['B1','Liverpool', '4,5', 'Mane'],
['B2','Liverpool', '5,6', 'Salah'],
['B3','Liverpool', '7,2', 'Jota']]
现在,对于每个列表,我想在它超过 stand_city
或 stand_liverpool
之前获取最后一个值。取决于列表中的 index[1]
。如果它 Manchester City
我需要它使用 stand_city
,如果 Liverpool
我希望它使用 stand_liverpool
。我希望将这些值存储在新列表中。
这是我的代码:
new_list = []
for key,sublists in itertools.groupby(premier_league,lambda y:y[0]):
club = (list(sublists)[0][1])
if club == 'Manchester City':
v=[]
for v in itertools.takewhile(lambda x:float(x[-2].replace(",","."))<stand_city ,sublists):
pass
if v:
x = v[-1]
new_list.append(x)
elif club == 'Liverpool':
v=[]
for v in itertools.takewhile(lambda x:float(x[-2].replace(",","."))<stand_liverpool ,sublists):
pass
if v:
x = v[-2]
new_list.append(x)
print(new_list)
这是我的输出:
[]
这是我想要的输出:
10,1
5,6
我对您的代码做了一些小的修改以获得您想要的结果。
stand_city = 11
stand_liverpool = 6.5
premier_league = [
['A1','Manchester City', '10,1', 'Aguero'],
['A2','Manchester City', '11,2', 'Mahrez'],
['A3','Manchester City', '13,5', 'Sterling'],
['B1','Liverpool', '4,5', 'Mane'],
['B2','Liverpool', '5,6', 'Salah'],
['B3','Liverpool', '7,2', 'Jota']]
res = []
for g, value in groupby(premier_league, key = lambda x:x[1]): # group by according to index 1
less_than = [] # temporary list to hold all values less than your threshold for a particular group
for i in value: # iterate thorugh the values in each group
float_i = float(i[2].replace(',', '.')) # convert index 2 to float
to_compare = stand_city if g == 'Manchester City' else stand_liverpool
if float_i < to_compare: # compare `float_i` with either `stand_city` or `stand_liverpool` based on group
less_than.append(i[2]) # add all values that meet the condition to a temp list
res.extend(less_than[-1:]) # take only the last element from the list for each group, `[-1:]` is done to prevent cases where `less_than` is an empty list
print(res) # ['10,1', '5,6']
或者更短的方式
from itertools import groupby
res = []
for g, value in groupby(premier_league, key = lambda x:x[1]):
last = [x[2] for x in value if float(x[2].replace(',', '.')) <= (stand_city if g == 'Manchester City' else stand_liverpool)][-1:]
res.extend(last)
print(res) # ['10,1', '5,6']
修复了 OP 的代码
import itertools
new_list = []
for key,sublists in itertools.groupby(premier_league,lambda y:y[1]):
if key == 'Manchester City':
v=[]
for v in itertools.takewhile(lambda x:float(x[-2].replace(",","."))<stand_city ,sublists):
pass
if v:
x = v[-2]
new_list.append(x)
elif key == 'Liverpool':
v=[]
for v in itertools.takewhile(lambda x:float(x[-2].replace(",","."))<stand_liverpool ,sublists):
pass
if v:
x = v[-2]
new_list.append(x)
print(new_list)
我有一个列表,其中包含多个列表,它看起来像这样:
import itertools
stand_city = 11
stand_liverpool = 6.5
premier_league = [
['A1','Manchester City', '10,1', 'Aguero'],
['A2','Manchester City', '11,2', 'Mahrez'],
['A3','Manchester City', '13,5', 'Sterling'],
['B1','Liverpool', '4,5', 'Mane'],
['B2','Liverpool', '5,6', 'Salah'],
['B3','Liverpool', '7,2', 'Jota']]
现在,对于每个列表,我想在它超过 stand_city
或 stand_liverpool
之前获取最后一个值。取决于列表中的 index[1]
。如果它 Manchester City
我需要它使用 stand_city
,如果 Liverpool
我希望它使用 stand_liverpool
。我希望将这些值存储在新列表中。
这是我的代码:
new_list = []
for key,sublists in itertools.groupby(premier_league,lambda y:y[0]):
club = (list(sublists)[0][1])
if club == 'Manchester City':
v=[]
for v in itertools.takewhile(lambda x:float(x[-2].replace(",","."))<stand_city ,sublists):
pass
if v:
x = v[-1]
new_list.append(x)
elif club == 'Liverpool':
v=[]
for v in itertools.takewhile(lambda x:float(x[-2].replace(",","."))<stand_liverpool ,sublists):
pass
if v:
x = v[-2]
new_list.append(x)
print(new_list)
这是我的输出:
[]
这是我想要的输出:
10,1
5,6
我对您的代码做了一些小的修改以获得您想要的结果。
stand_city = 11
stand_liverpool = 6.5
premier_league = [
['A1','Manchester City', '10,1', 'Aguero'],
['A2','Manchester City', '11,2', 'Mahrez'],
['A3','Manchester City', '13,5', 'Sterling'],
['B1','Liverpool', '4,5', 'Mane'],
['B2','Liverpool', '5,6', 'Salah'],
['B3','Liverpool', '7,2', 'Jota']]
res = []
for g, value in groupby(premier_league, key = lambda x:x[1]): # group by according to index 1
less_than = [] # temporary list to hold all values less than your threshold for a particular group
for i in value: # iterate thorugh the values in each group
float_i = float(i[2].replace(',', '.')) # convert index 2 to float
to_compare = stand_city if g == 'Manchester City' else stand_liverpool
if float_i < to_compare: # compare `float_i` with either `stand_city` or `stand_liverpool` based on group
less_than.append(i[2]) # add all values that meet the condition to a temp list
res.extend(less_than[-1:]) # take only the last element from the list for each group, `[-1:]` is done to prevent cases where `less_than` is an empty list
print(res) # ['10,1', '5,6']
或者更短的方式
from itertools import groupby
res = []
for g, value in groupby(premier_league, key = lambda x:x[1]):
last = [x[2] for x in value if float(x[2].replace(',', '.')) <= (stand_city if g == 'Manchester City' else stand_liverpool)][-1:]
res.extend(last)
print(res) # ['10,1', '5,6']
修复了 OP 的代码
import itertools
new_list = []
for key,sublists in itertools.groupby(premier_league,lambda y:y[1]):
if key == 'Manchester City':
v=[]
for v in itertools.takewhile(lambda x:float(x[-2].replace(",","."))<stand_city ,sublists):
pass
if v:
x = v[-2]
new_list.append(x)
elif key == 'Liverpool':
v=[]
for v in itertools.takewhile(lambda x:float(x[-2].replace(",","."))<stand_liverpool ,sublists):
pass
if v:
x = v[-2]
new_list.append(x)
print(new_list)