如何在Python中比较两个列表中的值?
我有两份清单:如何在Python中比较两个列表中的值?,python,list,indexing,Python,List,Indexing,我有两份清单: my_values = ['0,78', '0,40', '0,67'] my_list = [ ['Morocco', 'Meat', '190,00', '0,15'], ['Morocco', 'Meat', '189,90', '0,32'], ['Morocco', 'Meat', '189,38', '0,44'], ['Morocco', 'Meat', '188,94', '0,60'], ['Morocco', 'M
my_values = ['0,78', '0,40', '0,67']
my_list = [
['Morocco', 'Meat', '190,00', '0,15'],
['Morocco', 'Meat', '189,90', '0,32'],
['Morocco', 'Meat', '189,38', '0,44'],
['Morocco', 'Meat', '188,94', '0,60'],
['Morocco', 'Meat', '188,49', '0,78'],
['Morocco', 'Meat', '187,99', '0,101'],
['Spain', 'Meat', '190,76', '0,10'],
['Spain', 'Meat', '190,16', '0,20'],
['Spain', 'Meat', '189,56', '0,35'],
['Spain', 'Meat', '189,01', '0,40'],
['Spain', 'Meat', '188,13', '0,75'],
['Spain', 'Meat', '187,95', '0,78'],
['Italy', 'Meat', '190,20', '0,11'],
['Italy', 'Meat', '190,10', '0,31'],
['Italy', 'Meat', '189,32', '0,45'],
['Italy', 'Meat', '188,61', '0,67'],
['Italy', 'Meat', '188,01', '0,72'],
['Italy', 'Meat', '187,36', '0,80'],
]
我有一个检查以下内容的代码:
my_列表中的index[2]
是my_值==0,78
my_列表中的index[2]
是my_值==0,40
索引[2]
inmyu列表
是索引[3]
在myu值==0,67
my_values
中看到的0,78
在摩洛哥和西班牙存在,我只想让它检查摩洛哥
这是我的代码:
yet_another_list = [i[2] for i in my_list if i[3] in my_values]
print(yet_another_list)
这是我的输出:
['188,49', '189,01', '187,95', '188,61']
这是我喜欢的输出:
['188,49', '189,01', '188,61']
如您所见,我希望my_值的index[1]
仅用于摩洛哥
,而index[2]
用于西班牙
等。。。请注意,在我的Office数据集中,我的列表中包含了更多的国家
#添加。我甚至尝试了熊猫,但仍然收到了相同的输出。
df=pd.DataFrame(my_list)
df['Filter']=np.where([i in my_values for i in df[3]],"Yes","")
my_out_list=list(df[2][df['Filter']=='Yes'])
print(my_out_list)
>>
['188,49', '189,01', '187,95', '188,61']
我建议使用字典,然后过滤数据集
my_values = {'Morocco': '0,78', 'Spain': '0,40', 'Italy': '0,67'}
my_list = [
['Morocco', 'Meat', '190,00', '0,15'],
['Morocco', 'Meat', '189,90', '0,32'],
['Morocco', 'Meat', '189,38', '0,44'],
['Morocco', 'Meat', '188,94', '0,60'],
['Morocco', 'Meat', '188,49', '0,78'],
['Morocco', 'Meat', '187,99', '0,101'],
['Spain', 'Meat', '190,76', '0,10'],
['Spain', 'Meat', '190,16', '0,20'],
['Spain', 'Meat', '189,56', '0,35'],
['Spain', 'Meat', '189,01', '0,40'],
['Spain', 'Meat', '188,13', '0,75'],
['Spain', 'Meat', '187,95', '0,78'],
['Italy', 'Meat', '190,20', '0,11'],
['Italy', 'Meat', '190,10', '0,31'],
['Italy', 'Meat', '189,32', '0,45'],
['Italy', 'Meat', '188,61', '0,67'],
['Italy', 'Meat', '188,01', '0,72'],
['Italy', 'Meat', '187,36', '0,80'],
]
print([e[2] for e in filter(lambda x: x[3] == my_values[x[0]], my_list)])
>>> ['188,49', '189,01', '188,61']
作为补充说明,如果您使用的是更大的数据集,那么查看这个包可能会有所帮助,它是一个用于数据分析的流行Python库我建议您使用字典,然后过滤数据集
my_values = {'Morocco': '0,78', 'Spain': '0,40', 'Italy': '0,67'}
my_list = [
['Morocco', 'Meat', '190,00', '0,15'],
['Morocco', 'Meat', '189,90', '0,32'],
['Morocco', 'Meat', '189,38', '0,44'],
['Morocco', 'Meat', '188,94', '0,60'],
['Morocco', 'Meat', '188,49', '0,78'],
['Morocco', 'Meat', '187,99', '0,101'],
['Spain', 'Meat', '190,76', '0,10'],
['Spain', 'Meat', '190,16', '0,20'],
['Spain', 'Meat', '189,56', '0,35'],
['Spain', 'Meat', '189,01', '0,40'],
['Spain', 'Meat', '188,13', '0,75'],
['Spain', 'Meat', '187,95', '0,78'],
['Italy', 'Meat', '190,20', '0,11'],
['Italy', 'Meat', '190,10', '0,31'],
['Italy', 'Meat', '189,32', '0,45'],
['Italy', 'Meat', '188,61', '0,67'],
['Italy', 'Meat', '188,01', '0,72'],
['Italy', 'Meat', '187,36', '0,80'],
]
print([e[2] for e in filter(lambda x: x[3] == my_values[x[0]], my_list)])
>>> ['188,49', '189,01', '188,61']
作为一个补充说明,如果您使用的是更大的数据集,那么查看包(一个用于数据分析的流行Python库)可能会有所帮助。如果我正确理解您的需求,您希望循环列表中的国家,同时循环其他列表中的索引
previous=my_list[0][0]
ind=0
结果=[]
对于my_列表中的项目:
如果项目[0]!=以前的:
ind+=1
上一个=项目[0]
如果项目[3]==my_值[ind]:
结果。追加(项目[2])
打印(结果)
如果您的国家/地区多于my\u值中的值,这显然会抛出一个索引器
也许更好的方法是将my_list
转换为dict,其中键是国家名称,值是该国家的值。如果我正确理解您的要求,您希望循环列表中的国家,同时循环其他列表中的索引
previous=my_list[0][0]
ind=0
结果=[]
对于my_列表中的项目:
如果项目[0]!=以前的:
ind+=1
上一个=项目[0]
如果项目[3]==my_值[ind]:
结果。追加(项目[2])
打印(结果)
如果您的国家/地区多于my\u值中的值,这显然会抛出一个索引器
也许更好的方法是将my_list
转换为dict,其中键是国家名称,值是该国家的值,不过。使用带迭代器的原始数据结构
def get_values(my_list_, *my_values_):
''' Finds the desired result using my_list_ and my_values
my_valuesis one or more list
'''
output = []
# Find values for each list in my_values_
for my_values__ in my_values_:
# Create iterators
result = []
my_values_iter = iter(my_values__) # iterator for current list of values
my_list_iter = iter(my_list_) # from beginning of my_list_
v = next(my_values_iter, None)
i = next(my_list_iter, None)
while v and i:
if v == i[3]:
# found match
result.append(i[2])
v = next(my_values_iter, None) # Next value to find in my_values
i = next(my_list_iter, None) # Next value to check in my_list
else:
# try next value from my_list
i = next(my_list_iter, None) # Next value to check in my_list
output.append(result)
if len(output) == 1:
return output[0] # Only single list
else:
return tuple(x for x in output) # Output tuple of lists
用法
使用带有迭代器的原始数据结构
def get_values(my_list_, *my_values_):
''' Finds the desired result using my_list_ and my_values
my_valuesis one or more list
'''
output = []
# Find values for each list in my_values_
for my_values__ in my_values_:
# Create iterators
result = []
my_values_iter = iter(my_values__) # iterator for current list of values
my_list_iter = iter(my_list_) # from beginning of my_list_
v = next(my_values_iter, None)
i = next(my_list_iter, None)
while v and i:
if v == i[3]:
# found match
result.append(i[2])
v = next(my_values_iter, None) # Next value to find in my_values
i = next(my_list_iter, None) # Next value to check in my_list
else:
# try next value from my_list
i = next(my_list_iter, None) # Next value to check in my_list
output.append(result)
if len(output) == 1:
return output[0] # Only single list
else:
return tuple(x for x in output) # Output tuple of lists
用法
您误用了一个值作为唯一标识符,而该值不是唯一标识符。当有人留下注释而不是答案时,通常意味着他们没有完整的解决方案。也许可以查看以更好地了解此网站的工作原理。切换到Pandas,但复制相同的错误显然无法解决问题,尽管它可能会扩展得相当大。您误用了一个值作为唯一标识符,而该值不是唯一标识符。当有人留下评论而不是答案时,这通常意味着他们没有一个完整的解决方案。也许可以通过查看来更好地了解该网站的工作原理。切换到Pandas,但复制同一个bug显然不能解决问题,尽管它可能会有很大的扩展。我理解你的答案,但它不能解决我更大的数据集。你知道如何用Pandas解决这个问题吗?为什么你认为这对更大的数据集不起作用?@tripleee,因为我需要手动修复我的_值
。这并不是一个糟糕的答案。您当前的数据结构很麻烦,可能会带来额外的问题。好的,那么使用pandas并不能真正解决这个问题。如果my_list
中的城市顺序与my_values
中的值顺序相匹配,那么您可以通过一些额外的处理来利用它。我理解您的答案,但它无法解决我更大的数据集。你知道如何用Pandas解决这个问题吗?为什么你认为这对更大的数据集不起作用?@tripleee,因为我需要手动修复我的_值
。这并不是一个糟糕的答案。您当前的数据结构很麻烦,可能会带来额外的问题。好的,那么使用pandas并不能真正解决这个问题。如果my_list
中的城市顺序与my_values
中的值顺序相匹配,则您可以通过一些额外的处理来利用该顺序。您的回答是索引超出范围。我甚至试过熊猫,但仍然收到相同的输出;我忘记更新先前的变量。您的回答是索引超出范围。我甚至试过熊猫,但仍然收到相同的输出;我忘了更新前一个变量。@DarryIG,这似乎是个不错的变量。但是不能再短一点吗?不过我还有一个补充。如果我有另一个名为my_values_2
的额外列表,其中还有3个值,该怎么办。我可以复制粘贴代码,但我更喜欢一次完成…@TanGerCity——这意味着您需要我的值1和值2的结果列表。我的\u值\u 2是从一开始就检查我的\u列表,还是从我的\u值\u 1在我的\u列表中停止的位置继续检查?@DarryIG,它又从头开始。实际上,它也是一样的,只是my_values\u 2
@TangerCity中的不同值--已更新以处理一个或多个值列表。@darryg但t