如何将双列文件内容以第二列为键、第一列为值存入字典用于运算?
将两列数据转换为键为名称、值为可运算数值的字典
看起来你需要把这组空格分隔的两列数据,转换成以名称为键、数值为值的字典,而且数值要能直接进行数学运算对吧?这里我用Python来给你演示具体实现步骤,毕竟它处理字典和字符串解析都很方便。
首先,先理清楚你的数据结构:每两个元素是一组,前一个是带单位的数值(比如-34G),后一个是对应的名称(比如trendmar),而且同一个名称可能有多个数值,我们可以选择累加这些值,或者保留所有值,下面分别说明。
步骤1:拆分原始数据
首先把你的原始字符串拆分成列表,然后两两分组:
# 原始数据字符串 data_str = "-34G trendmar +41G trendmar 1.4G ttpsenet 3.6G tyibahco -13M uberhelp +19M uberhelp -8.9G umljgate +9.2G umljgate" # 拆分成单个元素的列表 data_elements = data_str.split() # 两两分组,得到(数值字符串, 名称)的列表 item_pairs = [(data_elements[i], data_elements[i+1]) for i in range(0, len(data_elements), 2)]
运行后,item_pairs会是这样的结构:
[('-34G', 'trendmar'), ('+41G', 'trendmar'), ('1.4G', 'ttpsenet'), ...]
步骤2:解析并转换数值为可运算格式
原始数值带单位(G/M),直接用字符串没法做数学运算,所以我们需要把它转换成统一的数值类型(比如浮点型的GB值,或者字节数)。这里写一个函数来处理单位转换:
示例1:转换为以GB为单位的浮点数(直观易读)
def convert_to_gb(size_str): # 处理正负号 sign = 1 if size_str.startswith('-'): sign = -1 size_str = size_str[1:] elif size_str.startswith('+'): size_str = size_str[1:] # 分离数值和单位 for idx, char in enumerate(size_str): if not char.isdigit() and char != '.': num = float(size_str[:idx]) unit = size_str[idx:].upper() break else: # 如果没有单位,默认按GB处理(或者根据你的需求调整) num = float(size_str) unit = 'GB' # 单位转换系数(二进制换算,1GB=1024MB,如果你用十进制就换成1000) unit_conversion = { 'B': 1 / (1024**3), 'KB': 1 / (1024**2), 'MB': 1 / 1024, 'GB': 1, 'TB': 1024 } return sign * num * unit_conversion.get(unit, 1)
示例2:转换为字节数(精确适合存储计算)
如果需要更精确的底层计算,可以转成字节数:
def convert_to_bytes(size_str): sign = 1 if size_str.startswith('-'): sign = -1 size_str = size_str[1:] elif size_str.startswith('+'): size_str = size_str[1:] for idx, char in enumerate(size_str): if not char.isdigit() and char != '.': num = float(size_str[:idx]) unit = size_str[idx:].upper() break else: num = float(size_str) unit = 'B' unit_conversion = { 'B': 1, 'KB': 1024, 'MB': 1024**2, 'GB': 1024**3, 'TB': 1024**4 } return sign * num * unit_conversion.get(unit, 1)
步骤3:构建目标字典
现在我们可以用上面的函数,把分组后的元素转换成字典。这里分两种情况:
情况1:同一个名称的数值累加(比如trendmar的-34G和+41G合并成7G)
result_dict = {} for size_str, name in item_pairs: converted_value = convert_to_gb(size_str) # 或者用convert_to_bytes if name in result_dict: result_dict[name] += converted_value else: result_dict[name] = converted_value print(result_dict)
输出结果(以GB为单位):
{ 'trendmar': 7.0, 'ttpsenet': 1.4, 'tyibahco': 3.6, 'uberhelp': 0.005859375, # 19M-13M=6M,转换成GB就是6/1024≈0.00586 'umljgate': 0.3000000000000007 # 9.2G-8.9G=0.3G }
情况2:保留同一个名称的所有数值(存储为列表)
如果不需要累加,想保留每个原始数值:
result_dict = {} for size_str, name in item_pairs: converted_value = convert_to_gb(size_str) if name not in result_dict: result_dict[name] = [] result_dict[name].append(converted_value) print(result_dict)
输出结果:
{ 'trendmar': [-34.0, 41.0], 'ttpsenet': [1.4], 'tyibahco': [3.6], 'uberhelp': [-0.0126953125, 0.0185546875], 'umljgate': [-8.9, 9.2] }
后续数学运算
现在字典里的值都是数值类型了,你可以直接做各种运算,比如:
# 计算trendmar和ttpsenet的总和 total = result_dict['trendmar'] + result_dict['ttpsenet'] print(f"总和:{total} GB") # 输出:总和:8.4 GB
内容的提问来源于stack exchange,提问作者Kareem El Sayed
相关产品推荐
相关产品推荐

