【问题标题】:Separating floats, ints, negatives and strings that contain letters and numbers and .'s in python在 python 中分离包含字母和数字以及 . 的浮点数、整数、负数和字符串
【发布时间】:2020-05-25 06:44:47
【问题描述】:

我目前有一个我遍历的字符串列表..

string1 = 'CRUC1AL 34 6 5 0 23 75.6 11 89.6 3 1.39 robiin 40 15 8 2 26 78.0 14 89.5 4 1.36 Surreal 31 14 6 2 25 68.3 6 79.8 2 1.17 MiGHTYMAX 24 8 7 2 26 78.0 -2 57.5 -2 1.02 Thomas 25 17 10 3 28 70.7 -3 77.8 -2 0.95'
string2 = 'Lucky 27 6 8 4 27 68.3 0 71.0 4 1.01 kiR 27 18 6 0 36 58.5 -9 77.6 1 0.92 kwezz 29 11 6 2 32 53.7 -3 77.2 -1 0.91 scott 20 6 5 2 26 56.1 -6 50.0 -2 0.75 cleMeNz0 25 15 5 3 33 48.8 -8 71.9 -7 0.74'

我将所有“,”替换为“”,这样我就可以遍历它们。现在我需要能够将名称放入 1 个列表和数字中。名称包含字母、数字、标点符号和破折号..

player_names1 = []
player_names2 = []
team1_list = []
team2_list = []
for i in string1:
    if i.isalpha() or i.endswith('.') or i.isupper():
        player_names1.append(i)
    elif not i.isalpha() and not i.endswith('.') and not i.isupper():
        team1_list.append(i)

for i in string2:
    if i.isalpha() or i.endswith('.') or i.isupper():
        player_names2.append(i)
    elif not i.isalpha() and not i.endswith('.') and not i.isupper():
        team2_list.append(i)

我考虑过使用索引或查找函数,但我不想为了做到这一点而对我的 if 语句创建一个新的而不是序列。 这种方法可以用 .在前一个字符串中并将 CRUC1AL 放入名称列表中,但现在有一个末尾带有 0 的字符串,它正试图将其附加到我的统计列表中。我也试过了。。

if not i.isdigit() and not i.startswith('-'):
    player_names1.append(i)
    print(i)
    #= CRUC1AL 75.6 89.6 1.39
else:
    team1_list.append(i)

但这会将花车和玩家名称附加在一起。我已经尝试搜索修复程序,但是我找不到任何可以分离浮点值的具体内容......所以我需要能够将浮点数、整数和负数与可能包含 -'s、.'s 和字母的名称。有什么建议?找到产生错误的完整代码here.. 此外,任何关于更优雅地编写我的代码的提示都会很棒!

【问题讨论】:

  • 你的解释不清楚。熊猫与您的问题有何关系?请显示预期输出的示例。
  • 数据从何而来?你有没有注意到它遵循一个模式?
  • @DYZ 94,50,20,6,78,388.4,16,386.6,10,6.07,16 是示例输出。我获取这些值,可以制作一个包含每个玩家的姓名和统计数据的字典,然后我可以只获取他们的统计数据的总和并将它们写入 CSV 文件进行分析。我遇到的问题的数据来自'hltv.org/stats/matches/mapstatsid/98497/…'

标签: python string pandas numpy loops


【解决方案1】:

您可以拆分空格并附加到相应的列表中。

player_names1 = []
team1_list = []
for idx, el in  enumerate(string1.split()):
   if idx % 11 == 0:
      player_names1.append(el)
   else:
      team1_list.append(el)

另一种方法可能是使用结果构建数据框。

>>> pd.DataFrame(np.array(string1.split()).reshape(5,11))
           0   1   2   3  4   5     6   7     8   9    10
0    CRUC1AL  34   6   5  0  23  75.6  11  89.6   3  1.39
1     robiin  40  15   8  2  26  78.0  14  89.5   4  1.36
2    Surreal  31  14   6  2  25  68.3   6  79.8   2  1.17
3  MiGHTYMAX  24   8   7  2  26  78.0  -2  57.5  -2  1.02
4     Thomas  25  17  10  3  28  70.7  -3  77.8  -2  0.95

【讨论】:

  • AttributeError: 'list' 对象没有属性 'split'。我想它将字符串视为列表对象,因此它们不能被拆分。我将尝试数据框样式。
  • string1 是字符串(您在示例中发布的字符串),而不是列表
  • 我编辑了我的代码以与你的一致,现在我收到 ValueError: could not convert string to float: 'CRUC1AL',因为稍后在代码中我制作了一个单独的列表元素。但只是将其直接转换为数据框确实有效,因此我将能够操纵我想如何使用统计数据。谢谢!
【解决方案2】:

您的数据似乎遵循某种模式:

[name] [int] [int] [int] [int] [int] [float] [int] [float] [int] [float]

假设您的目标是拆分数据,也就是说您不是纯粹为了学习而这样做,我们可以利用这种模式。

就像我选择使用 Pandas 的 @abc 一样,我认为对这种数据有意义,这意味着我们不必手动将每个值转换为适当的类型。

import pandas as pd

team_1_str = 'CRUC1AL 34 6 5 0 23 75.6 11 89.6 3 1.39 robiin 40 15 8 2 26 78.0 14 89.5 4 1.36 Surreal 31 14 6 2 25 68.3 6 79.8 2 1.17 MiGHTYMAX 24 8 7 2 26 78.0 -2 57.5 -2 1.02 Thomas 25 17 10 3 28 70.7 -3 77.8 -2 0.95'
team_2_str = 'Lucky 27 6 8 4 27 68.3 0 71.0 4 1.01 kiR 27 18 6 0 36 58.5 -9 77.6 1 0.92 kwezz 29 11 6 2 32 53.7 -3 77.2 -1 0.91 scott 20 6 5 2 26 56.1 -6 50.0 -2 0.75 cleMeNz0 25 15 5 3 33 48.8 -8 71.9 -7 0.74'

team_1_split = team_1_str.split()
team_2_split = team_2_str.split()

team_1_data = (team_1_split[i:i + 11] for i in range(0, len(team_1_split), 11))
team_2_data = (team_2_split[i:i + 11] for i in range(0, len(team_2_split), 11))

df_1 = pd.DataFrame(data=team_1_data)
df_2 = pd.DataFrame(data=team_2_data)

print(df_1, end='\n\n')
print(df_2)

输出:

           0   1   2   3  4   5     6   7     8   9    10
0    CRUC1AL  34   6   5  0  23  75.6  11  89.6   3  1.39
1     robiin  40  15   8  2  26  78.0  14  89.5   4  1.36
2    Surreal  31  14   6  2  25  68.3   6  79.8   2  1.17
3  MiGHTYMAX  24   8   7  2  26  78.0  -2  57.5  -2  1.02
4     Thomas  25  17  10  3  28  70.7  -3  77.8  -2  0.95

          0   1   2  3  4   5     6   7     8   9    10
0     Lucky  27   6  8  4  27  68.3   0  71.0   4  1.01
1       kiR  27  18  6  0  36  58.5  -9  77.6   1  0.92
2     kwezz  29  11  6  2  32  53.7  -3  77.2  -1  0.91
3     scott  20   6  5  2  26  56.1  -6  50.0  -2  0.75
4  cleMeNz0  25  15  5  3  33  48.8  -8  71.9  -7  0.74

【讨论】:

  • 试过这个并得到错误.. TypeError: 'generator' object is not subscriptable.. 我将尝试将明显的列表转换为字符串,然后将其运行到代码中,看看我是否可以得到相同的结果。有机会我会回复的。
猜你喜欢
  • 2013-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-24
  • 1970-01-01
  • 2013-02-27
  • 2017-07-21
  • 1970-01-01
相关资源
最近更新 更多