'How can I change an item that is a tuple inside a dict

I am trying to make a function that converts the currency in a given dict:

q = {
    '1': ('tissue', '200', '30USD'), 
    '2': ('shampoo', '300', '75000RUB'), 
    '3': ('vaseline', '180', '10USD'), 
    '5': ('cup', '0', '15USD'), 
    '4': ('chips', '150', '100USD'), 
    '6': ('chocolate', '0', '20USD')
}

This is the function i came up with:

def convert_price(q, rate=24000):
    prices = []
    converted_dict={}
    
    for value in q.values():
        l_value=list(value)
        target = l_value[2]
        new_price = target
        if target[-3:] == "RUB":
            new_price = str(int(target[:-3])/rate) + "USD"
            l_value[2] = new_price
            prices.append(new_price)
        else:
            prices.append(target)
    #print(prices)
    
    for price in prices:
        for id in q.keys():
            new = str(price)
            if new in q[id]:
                converted_dict[id]=q[id]
                break
    print(converted_dict)

convert_price(q)

The function above adds the new prices to the "prices" list. But it can't add the changed price because it couldn't find the same value witrh the same currency in the dict. How should I change the code to make it work?



Solution 1:[1]

Is this what you need? In your current code converted_dict doesn't contain key "2" because its price is in Rubel. If you need to add it. Below code will work.

def convert_price(q, rate=24000):
    prices = []
    converted_dict={}
    
    for value in q.values():
        l_value=list(value)
        target = l_value[2]
        new_price = target
        if target[-3:] == "RUB":
            new_price = str(int(target[:-3])/rate) + "USD"
            l_value[2] = new_price
            prices.append(new_price)
        else:
            prices.append(target)
    # print(prices)
    

    for i in range(len(prices)):
        id = str(i+1)
        temp_list= list(q[id])
        temp_list[2] = prices[i]
        converted_dict[id] = tuple(temp_list)
    print(converted_dict)

convert_price(q)

Solution 2:[2]

I'd suggest you to change your item list data type and implement a dynamic change_rate dict:

def convert_price(q, convert_to):
    for items in q:
        currency = items['currency']
        if currency != convert_to:
            rate = change_rate[f"{currency}/{convert_to}"]
            items['price'] = str(float(items['price']) * rate)
            items['currency'] = convert_to
    return q

if __name__ == '__main__':
    q = [
        {'id': '1', 'item': 'tissue', 'amount': '200', 'price': '30', 'currency': 'USD'}, 
        {'id': '2', 'item': 'shampoo', 'amount': '300', 'price': '75000', 'currency': 'RUB'}, 
        {'id': '3', 'item': 'vaseline', 'amount': '180', 'price': '10', 'currency': 'USD'},
        {'id': '5', 'item': 'cup', 'amount': '0', 'price': '15', 'currency': 'USD'},
        {'id': '4', 'item': 'chips', 'amount': '150', 'price': '100', 'currency':'USD'}, 
        {'id': '6', 'item': 'chocolate', 'amount': '0', 'price': '20', 'currency':'USD'}
    ]

    change_rate = {
        'RUB/USD': 1/24000
    }

    converted_items = convert_price(q, convert_to='USD')
    print(converted_items)

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Kasun Tharaka
Solution 2 Bil11