【问题标题】:Splitting list of strings based on a character in each string ( Python )根据每个字符串中的字符拆分字符串列表(Python)
【发布时间】:2020-08-10 11:44:57
【问题描述】:

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

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

这就是列表的生成方式和可读性(“视频”是硒网络元素的列表):

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'

【问题讨论】:

  • 感谢您不仅询问 Y,还询问 X :-)
  • 你说你想要浮动,然后显示字符串。是哪个?
  • 不幸的是,这并没有阻止一些回答者仍然解决 Y...
  • 我的帖子很无聊,我的意思是变成浮点数进行乘法,然后返回字符串以供进一步使用。 @superbrain

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


【解决方案1】:

这是一种方法

例如:

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

【讨论】:

  • 这行得通,但我还不明白为什么。不过还是谢谢你,我会继续学习,直到我明白为什么这真的有效,在那之前我会使用@Daweo提供的答案。
【解决方案2】:

如果你真的想要浮点数(你说你想要,然后显示字符串):

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

【讨论】:

    【解决方案3】:

    由于您的输入数据已经代表浮点值,我建议利用科学记数法结合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)
    

    输出:

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

    【讨论】:

      【解决方案4】:

      您收到此错误,因为在您的第一个 if 中,您只是在列表中任何地方有 K 的情况下替换 K,但这不会删除 M(第二个 @987654322 中的 K 也是如此@)。

      这样,您尝试将“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]
      

      【讨论】:

      • 我可能会尝试这是在我原来的意大利面条实现中。谢谢!!
      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

        更明确一点,并检查输入:

        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 和其他人的方法。 但特别是如果一个人是编程新手,我喜欢更冗长一些。代码高尔夫很好,但往往不太容易理解。

        【讨论】:

        • 你如何将它们合并回它们声明的最终目标?
        • @superbrain 对不起,我错过了。它可以在循环中完成(以内存使用为代价)。如果kilosmegas 不是真正需要的,则可以消除它们(这样就可以消除惩罚)。
        • 这回答了我的第一个问题,并且以对新手友好的方式!谢谢你。 Rakesh 和@Daweo 也解决了整体问题。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-06
        • 2019-03-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多