根据每个字符串中的字符拆分字符串列表(Python)

时间:2020-08-10 11:44:57

标签: python python-3.x string list selenium

所以我有一个看起来像这样的字符串列表:

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

这是生成列表并使之可读的方式(“视频”是硒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:无法将字符串转换为float:'2M'

6 个答案:

答案 0 :(得分:4)

这是一种方法

例如:

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)

输出:

['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']

答案 1 :(得分:1)

如果您实际上想要浮点数(您说可以,但随后显示字符串):

>>> [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]

答案 2 :(得分:0)

您将收到此错误,因为在第一个if中,您仅替换了K,以防列表中的任何地方都有K,但这并没有删除M(第二个K也是如此) if

那样,您试图将“ 2M”强制转换为浮点数,因为您仅替换了K,但M项仍然具有其M(反之亦然)。您应该首先创建您提到的两个列表,然后根据它们将K和M分开,然后遍历第一个if中的K列表(以及第二个if中的M列表) )。

可以创建两个单独的列表,如下所示:

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]

答案 3 :(得分:0)

更加明确,并检查输入内容:

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和其他人的做法。 但是,特别是如果您是编程的新手,我喜欢稍微冗长一些。代码高尔夫虽然不错,但易于理解。

答案 4 :(得分:0)

由于您的输入数据已经具有浮点值,因此我建议采用科学符号和onCommit相结合,方法如下:

<div class="container">
  <div class="page-header section-dark" style="background-image:  url('assets/img/5514.jpg'); filter: brightness(200%)">
    <button class="btn">Button</button>
  </div>
</div>

输出:

.container .btn {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  -ms-transform: translate(-50%, -50%);
  background-color: #555;
  color: white;
  font-size: 16px;
  padding: 12px 24px;
  border: none;
  cursor: pointer;
  border-radius: 5px;
}

答案 5 :(得分:0)

这是另一种方法,可能不是最好的方法。

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]

输出

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

输出

['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']