Эффективная замена элементов списка в Python - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть список Python следующим образом: -

l=['EUR/USD',
 'USD/JPY',
 'GBP/USD',
 'USD/CAD',
 'AUD/USD',
 'NZD/USD',
 'USD/CHF',
 'USD/NOK',
 'USD/SEK']

Я хочу, чтобы базовой валютой был доллар США. Это означает, что первый элемент l будет USD/EUR. Следующий код работает, но мне было интересно, есть ли лучший способ сделать это.

l2=[]
for x in range(len(l)):
    l2.append(l[x].split('/'))

k=pd.DataFrame(l2)

for i in range(len(k)):

    if k.iloc[i,0]=='USD':
        print("base currency is USD")

    else:
        print("Base currency is not USD. Making it base currency")
        temp=k.iloc[i,0]
        k.iloc[i,0]='USD'
        k.iloc[i,1]=temp

Ответы [ 3 ]

0 голосов
/ 09 ноября 2018

Определите функцию для инвертирования пары и затем используйте map

In [759]: def usd_base(ccy):
     ...:     delimiter = '/'
     ...:     base, term = ccy.split(delimiter)
     ...:     if base != 'USD' and term == 'USD':
     ...:         return delimiter.join((term, base))
     ...:     return ccy
     ...:

In [760]: list(map(usd_base, l))
Out[760]:
['USD/EUR',
 'USD/JPY',
 'USD/GBP',
 'USD/CAD',
 'USD/AUD',
 'USD/NZD',
 'USD/CHF',
 'USD/NOK',
 'USD/SEK']

Если вы еще не используете DataFrame, вероятно, нет причин создавать его только для этой цели для list такого размера

Для Python 2 вы можете просто использовать

map(usd_base, l)
0 голосов
/ 09 ноября 2018

Вы можете архивировать с endswith + split + join

['/'.join(i.split('/')[::-1]) if i.endswith('USD') else i for i in l]

Результат

['USD/EUR',
 'USD/JPY',
 'USD/GBP',
 'USD/CAD',
 'USD/AUD',
 'USD/NZD',
 'USD/CHF',
 'USD/NOK',
 'USD/SEK']
0 голосов
/ 09 ноября 2018

Я бы написал так, что IMO немного читабельнее.

>>> l=['EUR/USD', 'USD/JPY', 'GBP/USD', 'USD/CAD', 'AUD/USD', 'NZD/USD', 'USD/CHF', 'USD/NOK', 'USD/SEK']
>>>
>>> result = []
>>> delim = '/'
>>> for currencies in l:
...:    first, second = currencies.split(delim)
...:    if first == 'USD':
...:        result.append(currencies)
...:    else:
...:        result.append(delim.join((second, first)))
...:        
>>> result
>>> 
['USD/EUR',
 'USD/JPY',
 'USD/GBP',
 'USD/CAD',
 'USD/AUD',
 'USD/NZD',
 'USD/CHF',
 'USD/NOK',
 'USD/SEK']

В качестве общего совета, избегайте использования явных индексов при повторении, как у чумы. Часто существует более удобочитаемое решение, чем индексирование структуры данных с помощью целых чисел (не всегда, конечно).

Вот классное видео: Цикл как родной: в то время как, для, итераторов, генераторов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...