使用某些逻辑从相同索引位置的多个列表中删除所有值

时间:2011-04-29 18:01:26

标签: python

我是编程的初学者,也是Python的初学者。以下是更好地了解我的问题的详细信息。

Rooms = ['BlueRoom', 'RedRoom', 'GreenRoom', 'BlueRoom']
Availability = [5, 7, 3, 5]
Description = ['Blue', 'Red', 'Green', 'Blue']
Price = [120, 90, 150, 115]

我需要的是相同的列表,但使用BlueRoom和删除最高价格的列表的相同索引位置中的所有值,如下所示:

Rooms = ['RedRoom', 'GreenRoom', 'BlueRoom']
Availability = [7, 3, 5]
Description = ['Red', 'Green', 'Blue']
Price = [90, 150, 115]

如果有人能帮助我,我真的很感激。这个列表只是例如,但我必须处理的列表将有几个重复的房间,我将不得不对每个房间执行相同的操作。

编辑:首先,谢谢大家的快速解答。另一方面,我忘了提一点,但一点也不重要,细节。我必须使用非常古老的解释器Jython 2.2版进行编码。因此,某些功能可能对我不起作用。

7 个答案:

答案 0 :(得分:1)

Rooms = ['BlueRoom', 'RedRoom', 'GreenRoom', 'BlueRoom']
Availability = [5, 7, 3, 5]
Description = ['Blue', 'Red', 'Green', 'Blue']
Price = [120, 90, 150, 115]

highest_price = max(Price)
x = Price.index(highest_price)
list = [Rooms,Availability,Description,Price]

for item in list:
    del item[x]

print Rooms
print Availability
print Description
print Price

我认为这就是你所需要的。 :d

-EDIT-它在Price中找到最高价值。查找该值的索引,然后从所有列表中删除该索引。 -EDIT-

答案 1 :(得分:1)

为了处理这样的并行列表,我建议使用zip

room_data = zip(Rooms, Availability, Description, Price)
room_data[0]
-> ('BlueRoom', 5, 'Blue', 120)

然后你可以对该列表进行一些逻辑处理:

blue_rooms = [r for r in room_data if r[0] == 'BlueRoom']
best_blue_room = max(blue_rooms, key=lambda (r,a,d,p): p)
room_data.remove(best_blue_room)
Rooms, Availability, Description, Price = map(list, zip(*room_data))

也许考虑直接在room_data上工作,而不是像上面最后一行那样来回转换......

答案 2 :(得分:0)

您可以通过指定两个索引来获取列表的子集,称为“切片”。返回值是包含列表的所有元素的新列表,从第一个切片索引开始,直到但不包括第二个切片索引。如果省略第二个索引,它将继续到列表的末尾,例如

Rooms = Rooms[1:]

房间将等于

Rooms = ['RedRoom', 'GreenRoom', 'BlueRoom']

答案 3 :(得分:0)

CurrentRoom = Rooms.pop(0)将从列表中取出第一项并将其保存在CurrentRoom中。如果您不需要保留或使用它,只需Rooms.pop(0)

答案 4 :(得分:0)

我真的鼓励你使用不同的解决方案,你想做什么,我认为是可能的,但它不优雅和可维护。

如果您创建一个类来代表您的房间并且只使用一个房间列表,我认为会更好。

答案 5 :(得分:0)

首先,直接回答您的问题:您可以使用del list_name[index]或在示例del Rooms[0]中按索引从列表中删除到位元素。没有一个班轮使用这种技术从所有四个列表中删除相同的索引元素。它需要四个del语句。

如果你的问题是关于找到价格最高的商品索引的逻辑,那么要做的就是这样(用pythony伪代码表示):

idx_of_highest = 0
for i in range(Price.length()):
  if Price[i] > Price[idx_of_highest]:
    idx_of_highest = i
del Room[i]
del Price[i]
del Description[i]
del Availability[i]

这假设您的列表未按价格排序,并且基本上是随机顺序。如果不是,最高价格是第一个或最后一个指数。

其次,在这种情况下,你可能想考虑使用一个字典列表,或者甚至是一个类列表,你已经有了这么远。

编辑:如果您不知道“到位”的含义,则表示列表本身被永久修改,即您没有获得副本或部分副本(切片)。如果您想要列表的副本,那么最简单的方法是使用切片表示法,例如要获取第n个元素的列表副本,请使用list_name[0:n]+list_name[n+1:]而不是del语句。将结果分配给您选择的变量,如new_rooms = rooms[0:i]+rooms[i+1:]

答案 6 :(得分:0)

正如Jochen在评论中指出的那样,你最好写一堂课来存储你的信息。班级的每个实例都可以存储与单个房间相关的所有信息。

class Room(object):
    def __init__(self, name, availability, description, price):
        self.name = name
        self.availability = availability
        self.description = description
        self.price = price

rooms = [Room('BlueRoom', 5, 'Blue', 120), ...]

这样,有关单个房间的所有信息始终保持在一起,您不必担心保持不同的列表同步。因此,您只需搜索列表即可找到重复的房间,并删除您不想要的房间。

例如,假设您希望仅保留与给定描述匹配的价格最低的房间。我这样做的方式是

import itertools

# here is where you might insert the class code from above

def namekey(room):
    return room.name
def pricekey(room):
    return room.price
sorted_rooms = sorted(rooms, namekey)

首先,您需要按名称对列表房间进行排序,以便使用以下代码。

cheapest_rooms = []

这会创建一个新列表,我们将填写每个名称最便宜的房间。

for name, group in itertools.groupby(sorted_rooms, namekey):

这会将房间列表按名称拆分为子列表。

    cheapest = min(group, key=pricekey)

这可以找到团队中最便宜的房间。

    cheapest_rooms.append(cheapest)

然后将其添加到列表中。

所有这些都可以压缩成

import itertools

# here is where you might insert the class code from above

def namekey(room):
    return room.name
def pricekey(room):
    return room.price
[min(group, key=pricekey) for name, group \
      in itertools.groupby(sorted(rooms, namekey), namekey)]