python 优雅地按价格排序并删除价格[已关闭]

wn9m85ua  于 2023-02-11  发布在  Python
关注(0)|答案(8)|浏览(170)
    • 已关闭**。此问题为opinion-based。当前不接受答案。
    • 想要改进此问题吗?**请更新此问题,以便editing this post可以用事实和引文来回答。

5小时前关门了。
Improve this question
我有一张购物单:

items = [
    ['Aspirin', 'Walgreens', 6.00],
    ['book lamp', 'Amazon', 2.87],
    ['popsicles', 'Walmart', 5.64],
    ['hair brush', 'Amazon', 6.58],
    ['Listerine', 'Walmart', 3.95],
    ['gift bag', 'Target', 1.50]
]

我想排序的项目从最便宜的到最高的价格,并删除价格。(我不需要他们了,然后,我只是从上往下买,直到我用完了钱)。目标是:

items = [
    ['gift bag', 'Target'],
    ['book lamp', 'Amazon'],
    ['Listerine', 'Walmart'],
    ['popsicles', 'Walmart'],
    ['Aspirin', 'Walgreens'],
    ['hair brush', 'Amazon']
]

一种有效但看起来笨拙的方法(演示/模板):

import operator
items = sorted(items, key=operator.itemgetter(2))
for i in range(len(items)):
    items[i] = items[i][:2]

有没有优雅的方式?也许一条线?

2ekbmq32

2ekbmq321#

我不知道我对使用key的副作用有什么感觉,但是:

items.sort(key=list.pop)
print(items)

结果:

[['gift bag', 'Target'], ['book lamp', 'Amazon'], ['Listerine', 'Walmart'], ['popsicles', 'Walmart'], ['Aspirin', 'Walgreens'], ['hair brush', 'Amazon']]```
2lpgd968

2lpgd9682#

在python中使用列表解析的美妙之处。

items = sorted(items, key=lambda x: x[2])
items = [x[:2] for x in items]
wz8daaqr

wz8daaqr3#

如果使用内置的sorted方法会怎样:

items = [
    ['Aspirin', 'Walgreens', 6.00],
    ['book lamp', 'Amazon', 2.87],
    ['popsicles', 'Walmart', 5.64],
    ['hair brush', 'Amazon', 6.58],
    ['Listerine', 'Walmart', 3.95],
    ['gift bag', 'Target', 1.50]
]

new_list = sorted(items, key=lambda x: x[2]) <== this sorts by the third element from your each list
    
for i in new_list:
    del i[2]

print(new_list)

输出:

x6492ojm

x6492ojm4#

下面是另一种方法:

items = list(map(lambda x: x[:2], sorted(items, key=lambda x: x[2])))
print(items)

您也可以尝试operator
x一个一个一个一个x一个一个二个x

yb3bgrhw

yb3bgrhw5#

有人建议我可以使用更多的“for”和更少的内置函数:

_,items = zip(*sorted((z, x) for *x,z in items))
qyuhtwio

qyuhtwio6#

齐普齐普

from operator import itemgetter
from itertools import islice

print(
    list(zip(*islice(zip(*sorted(items, key=itemgetter(-1))),2)))
)
# [('gift bag', 'Target'), ('book lamp', 'Amazon'), ('Listerine', 'Walmart'), ('popsicles', 'Walmart'), ('Aspirin', 'Walgreens'), ('hair brush', 'Amazon')]
f8rj6qna

f8rj6qna7#

不可避免的numpy版本。通过推断最后一列的值的重新排序wrt来选择前两列。

import numpy as np

a = np.array(items)

a = a[:,:2][a[:,-1].argsort()]
yv5phkfx

yv5phkfx8#

const items = [
    ['Aspirin', 'Walgreens', 6.00],
    ['book lamp', 'Amazon', 2.87],
    ['popsicles', 'Walmart', 5.64],
    ['hair brush', 'Amazon', 6.58],
    ['Listerine', 'Walmart', 3.95],
    ['gift bag', 'Target', 1.50]
]

items.sort((a,b)=>{return a[2]-b[2]});

const res = items.map((ele)=> {
  const [a, b] = ele;
  return [a,b];
})

console.log(res)

我不知道这是优化代码,但希望它会对你有帮助。

相关问题