Как я могу определить элемент из списка в другом списке - PullRequest
1 голос
/ 17 марта 2011

Я пытался создать блок кода, который найдет индекс наибольшей ставки для каждого элемента. Затем я собирался использовать индекс как способ идентифицировать человека, который заплатил столько денег. Однако, что бы я ни пытался, я не могу связать человека и то, что он получил с аукциона. Вот код, который я писал: он должен уметь работать с любой вводимой информацией

def sealedBids():
    n = int(input('\nHow many people are in the group? '))#determines loop lengths
    z = 0#meant to act as a counter in while loops
    g = []#meant to store the names of all the people/players
    s = []#meant to store name of all items being bidded on
    b = []#meant to store all bids made
    f = []#meant to store the each persons fair share
    w = []#meant to store the highest bid for each item
    q = []#trying to get it to store person linked to whatever they won

    while z < n:#Process: to make the list nest lists
        b.append([])
        z = z + 1
    z = 0

    while z < n:
        g.append(input('Enter a bidders name: '))#Input: Persons name
        z = z + 1                                #Process: store name in g[] list
    z = 0

    i = int(input('How many items are being bid on?'))#determines so loop lengths

    while z < i:
        s.append(input('Enter the name of an item: '))#input: Name of item
                                                          #process: stores names in s[] list
        w.append(z)#was going to swap the info inside with the info I wanted
        z = z + 1
    z = 0
    for j in range(n):#specifies which persons bid your taking
        for k in range(i):#specifies which item is being bid on
            b[j].append(int(input('How much money has {0} bid on the {1}? '.format(g[j], s[k]))))#input: takes bid for certain item
                                                                                                       #process: stores bid in b[] list
        print(' ')#adds a space when questions are being asked so it doesn't look crunched up

    for j in range(n):#calculates fair share
        f.append(sum(b[j])/n)#add a persons total bids then divides it by number of people bidding

    for j in range(i):#meant to change the item after every bid is compared to stored highest bid
        for k in range(n):#meant to change to a different persons bid to find out who bid the most money on a particular item
            if w[j] < b[k][j]:#compares stored highest bid for particular item to each persons bid
                w[j] = b[k][j]#if highest bid is smaller then highest bid changes to the bid that was larger
                q.append(k)#trying to get it to store indentifier for whoever has highest bid so that I can use it later to link it with highest bid somehow
    print(g)#meant to check outcome
    print(s)#meant to check outcome
    print(w)#meant to check outcome
    print(q)#meant to check outcome
    print(b)#meant to check outcome

print(f)#meant to check outcome

любой совет очень ценится.

Ответы [ 3 ]

1 голос
/ 17 марта 2011

Я думаю, что было бы проще использовать словари с именами в качестве ключей, чтобы вы могли видеть, что происходит:

group_size = 3
bidders = ('Alice', 'Bob', 'Eve')
items = ('Pipe', 'Wrench')

bids = dict(((item ,dict(((bidder, 0) for bidder in bidders))) for item in items))

#>>> print bids
#{'Pipe': {'Bob': 0, 'Alice': 0, 'Eve': 0},
# 'Wrench': {'Bob': 0, 'Alice': 0, 'Eve': 0}}

#get the money amounts
for item in bids:
    for bidder in bids[item]:
        bids[item][bidder] = int(raw_input('How much money has {0} bid on the {1}?'.format(bidder, item)))

highest_bidders = dict((item, bidder) for item in bids for bidder in bids[item]
                        if bids[item][bidder] == max(bids[item].itervalues()))
print highest_bidders
1 голос
/ 17 марта 2011

Вы можете использовать другую структуру для ваших ставок.Вместо использования разных списков, синхронизированных по индексу, вы можете использовать словарь и кортежи Python.Может быть, что-то вроде этого:

items_bids = { 
  item1:  [ (bidder1, amount), (some_other_bidder, amount), ... ],
  item2:  [ (bidder1, amount), (some_other_bidder, amount), ... ],
  .
  .
  .
}

Затем восстановление макс.Ставки для каждого элемента просты:

for item, bids in items_bids.iteritems():
    print max(bids, key=lambda x: x[1])

Вы можете создать свою структуру данных по-разному, так как эта система имеет быструю вставку предложений, но требует больше времени для получения самой высокой ставки.Кроме того, получение всех ставок, сделанных одним участником, было бы более трудоемким для компьютера.

А для более понятного кода вы можете использовать некоторые объекты с именованными полями вместо кортежей.

0 голосов
/ 17 марта 2011

Это ужасный код - попробуйте это:

def sealedBids():
  n = input('\nHow many people are in the group? ')
  assert isinstance(n, int)
  bidders = {}
  for i in range(n):
    bidders[raw_input('Enter a bidders name: ')] = {}
  n = input('How many items are being bid on?')
  assert isinstance(n, int)
  bid_items = {}
  for i in range(n):
    bid_items[raw_input('Enter a item name: ')] = {}
  del n
  f = []
  for bidder, bidder_bids in bidders.items():
    for bid_item, bid_item_bids in bid_items.items():
      bid = input('How much money has %s bid on the %s? '%(bidder, bid_items)
      assert isinstance(bid, int)
      bidder_bids[bid_item] = bid
      bid_item_bids[bidder] = bid
    print ''
    f.append(sum(bidder_bids.values())/len(bidders)) # what is this for?
  for bid_item, bid_item_bids in bid_items.items():
    inv_bid_item_bids = dict(map(lambda item: (item[1],item[0]),bid_item_bids.items()))
    high_bid = max(inv_bid_item_bids.keys())
    high_bidder = inv_bid_item_bids[high_bid]
    bid_items[bid_item] = (high_bidder, high_bid)
...