簡體   English   中英

根據每個字符串中的字符拆分字符串列表( Python )

[英]Splitting list of strings based on a character in each string ( Python )

所以我有一個看起來像這樣的字符串列表:

my_list = ['389.3K', '2M' , '1.9M' , '6.9M' , '4.3M' , '251.5K' , '3.6M']

這就是列表的生成方式和可讀性(“視頻”是 selenium webelements 的列表):

my_list = [x.text for x in video]
video.extend(my_list)
my_list = [i for i in my_list if i if not 'ago' in i]
my_list = [w.replace("Views", "") for w in my_list]

我想做的是根據每個元素中的一個特定字符將此列表拆分為另外兩個列表,如下所示:

k_list = ['389.3K' , '251.5K']

m_list = ['2M' , '1.9M' , '6.9M' , '4.3M' , '3.6M']

我的最終目標是能夠僅將元素中的數字作為浮點數並將每個元素乘以它們的適當數量( K = *1000 和 M = *1000000 ),例如:

my_new_list = ['389,300' , '2,000,000‬' , '1,900,000' , '6,900,000‬' , '4,300,000', '251,500' , '3,600,000‬']

我是 python 的新手(一般編碼 tbh),所以請原諒任何意大利面條代碼或糟糕的思考過程。

這是我嘗試過的:

k_val = "K"
m_val = "M"

if any(k_val in s for s in my_list):
    my_list = [w.replace("K", "") for w in my_list]
    my_list = [float(i) for i in vmy_list]
    my_list = [elem * 1000 for elem in my_list]
elif any(m_val in x for x in my_list):
    my_list = [w.replace("M", "") for w in my_lists]
    my_list = [float(i) for i in my_list]
    my_list = [elem * 1000000 for elem in my_list]

我得到:

ValueError:無法將字符串轉換為浮點數:'2M'

這是一種方法

前任:

my_list = ['389.3K', '2M' , '1.9M' , '6.9M' , '4.3M' , '251.5K' , '3.6M']
data = {"K": 1000, "M": 1000000}
result = [float(i[:-1])*data.get(i[-1], 0) for i in my_list]
print(result)

如果你最后有多個字符串使用

import re
import locale    #https://stackoverflow.com/a/5180615/532312

locale.setlocale(locale.LC_ALL, '')

my_list = ['389.3K', '2M' , '1.9M' , '6.9M' , '4.3M' , '251.5K' , '3.6M']
data = {"K": 1000, "M": 1000000}

result = []
for i in my_list:
    m = re.match(r"(\d+\.?\d*)([A-Z])", i)
    if m:
        value, key = m.groups()
        result.append(locale.currency(float(value) * data.get(key, 0), symbol=False, grouping=True))
print(result)

Output:

['389,300.00', '2,000,000.00', '1,900,000.00', '6,900,000.00', '4,300,000.00', '251,500.00', '3,600,000.00']

如果你真的想要浮點數(你說你想要,然后顯示字符串):

>>> [float(s.replace('K', 'e3').replace('M', 'e6')) for s in my_list]
[389300.0, 2000000.0, 1900000.0, 6900000.0, 4300000.0, 251500.0, 3600000.0]

您收到此錯誤,因為在您的第一個錯誤中, if您只替換 K,以防列表中的任何地方都有 K,但這不會刪除 M(第二個if中的 K 也是如此)。

這樣,您嘗試將“2M”轉換為浮點數,因為您只替換了 K,但 M 項仍然具有它們的 M(反之亦然)。 您應該首先創建您提到的這兩個列表,根據 K 和 M 將它們拆分,然后在第一個if中迭代 K-list(以及第二個if中的 M-list)。

創建這兩個單獨的列表可以這樣完成:

k_list = [val for val in my_list if k_val in val]
m_list = [val for val in my_list if m_val in val]

更明確一點,並檢查輸入:

k_val = 'K'
m_val = 'M'
my_list = ['389.3K', '2M' , '1.9M' , '6.9M' , '4.3M' , '251.5K' , '3.6M']
kilos = []
megas = []
entire = []

for val in my_list:
    if val[-1] == k_val:
        fval = float(val[:-1]) * 1000
        kilos.append(fval)
    elif val[-1] == m_val:
        fval = float(val[:-1]) * 1000000
        megas.append(fval)
    else:
        print("detected invalid value: " + val)
        continue
    entire.append(fval)

print(str(kilos))
print(str(megas))
print(str(entire))

我喜歡 Rakesh 和其他人的方法。 但特別是如果一個人是編程新手,我喜歡更冗長一些。 代碼高爾夫很好,但往往不太容易理解。

由於您的輸入數據已經代表浮點值,我建議利用科學記數法與float結合以下方式:

my_list = ['389.3K', '2M' , '1.9M' , '6.9M' , '4.3M' , '251.5K' , '3.6M']
e_list = [i.replace('K','e3').replace('M','e6') for i in my_list]
values = [float(i) for i in e_list]
my_new_list = [f'{int(i):,}' for i in values]
print(my_new_list)

Output:

['389,300', '2,000,000', '1,900,000', '6,900,000', '4,300,000', '251,500', '3,600,000']

這是另一種方法,可能不是最好的。

my_list = ['389.3K', '2M' , '1.9M' , '6.9M' , '4.3M' , '251.5K' , '3.6M']

k_list = [float(i[:-1])*1000 for i in my_list if i.endswith('K')]
m_list = [float(i[:-1])*1000000 for i in my_list if i.endswith('M')]


k_list_strings = [f'{num:,}' for num in k_list]
m_list_strings = [f'{num:,}' for num in m_list]

output

[389300.0, 251500.0]
[2000000.0, 1900000.0, 6900000.0, 4300000.0, 3600000.0]

output

['389,300.0', '251,500.0']
['2,000,000.0', '1,900,000.0', '6,900,000.0', '4,300,000.0', '3,600,000.0']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM