【问题标题】:finding the same words in two files and leaving out not repeated ones in python在两个文件中找到相同的单词并在 python 中省略不重复的单词
【发布时间】:2020-09-29 07:49:01
【问题描述】:

我必须编写一个将吸烟与肺癌风险关联起来的程​​序。为此,我在两个文件中有数据。 我的代码正在计算在同一行中给出的数据(例如:美国,23.3 与西班牙,77.9 和 意大利,24.2 与俄罗斯,60.8) 如何修改我的代码,以便计算相同国家/地区的数量并忽略仅出现在一个文件中的国家(它不应该计算德国、法国、中国、韩国,因为它们只在一个文件中) 非常感谢您提前提供的帮助:)

吸烟档案:

Country, Percent Cigarette Smokers Data

America,23.3

Italy,24.2

Russia,23.7

France,14.9

England,17.9

Spain,17

Germany,21.7

第二个文件:

Cases Lung Cancer per 100000 

Spain,77.9

Russia,60.8

Korea,61.3

America,73.3

China,66.8

Vietnam,64.5

Italy,43.9

和我的代码:

def readFiles(smoking_datafile, cancer_datafile):
'''
    Reads the data from the provided file objects smoking_datafile
    and cancer_datafile. Returns a list of the data read from each
    in a tuple of the form (smoking_datafile, cancer_datafile).
'''

# init
smoking_data = []
cancer_data = []
empty_str = ''

# read past file headers
smoking_datafile.readline()
cancer_datafile.readline()

# read data files
eof = False

while not eof:

    # read line of data from each file
    s_line = smoking_datafile.readline()
    c_line = cancer_datafile.readline()

    # check if at end-of-file of both files
    if s_line == empty_str and c_line == empty_str:
        eof = True

    # check if end of smoking data file only
    elif s_line == empty_str:
        raise OSError('Unexpected end-of-file for smoking data file')

    # check if at end of cancer data file only
    elif c_line == empty_str:
        raise OSError('Unexpected end-of-file for cancer data file')

    # append line of data to each list
    else:
        smoking_data.append(s_line.strip().split(','))
        cancer_data.append(c_line.strip().split(','))

# return list of data from each file
return (smoking_data, cancer_data)


def calculateCorrelation(smoking_data, cancer_data):
    '''
        Calculates and returns the correlation value for the data
        provided in lists smoking_data and cancer_data
    '''    

# init
sum_smoking_vals = sum_cancer_vals = 0
sum_smoking_sqrd = sum_cancer_sqrd = 0
sum_products = 0

# calculate intermediate correlation values
num_values = len(smoking_data)

for k in range(0,num_values):

    sum_smoking_vals = sum_smoking_vals + float(smoking_data[k][1])
    sum_cancer_vals = sum_cancer_vals + float(cancer_data[k][1])

    sum_smoking_sqrd = sum_smoking_sqrd +  \
                          float(smoking_data[k][1]) ** 2
    sum_cancer_sqrd = sum_cancer_sqrd +  \
                          float(cancer_data[k][1]) ** 2

    sum_products = sum_products + float(smoking_data[k][1]) *  \
                   float(cancer_data[k][1])

# calculate and display correlation value
numer = (num_values * sum_products) - \
        (sum_smoking_vals * sum_cancer_vals)

denom = math.sqrt(abs( \
    ((num_values * sum_smoking_sqrd) - (sum_smoking_vals ** 2)) * \
    ((num_values * sum_cancer_sqrd) - (sum_cancer_vals ** 2)) \
    ))

return numer / denom

【问题讨论】:

  • 欢迎来到 SO!请详细说明您的代码当前做了什么以及为什么它不适合您。根据您的问题,我无法确定您的问题是什么。
  • 我的代码正在计算同一行中给出的数据(例如:美国、23.3 西班牙、77.9 意大利、24.2 与俄罗斯、60.8) 如何修改我的代码以便计算相同的数字国家并忽略只出现在一个文件中的国家(它不应该计算德国、法国、中国、韩国,因为它们只在一个文件中)。这是我在代码末尾所要求的
  • 并编辑了我的代码。希望现在详细说明
  • 首先您可以在文件中创建两个国家/地区列表,然后使用set() 检查哪些名称是唯一的。

标签: python database file self-modifying


【解决方案1】:

让我们专注于将数据转换为易于使用的格式。下面的代码将为您提供格式为 ...

的字典
smokers_cancer_data = {
    'America': {
        'smokers': '23.3',
        'cancer': '73.3'
    }, 
    'Italy': {
        'smokers': '24.2',
        'cancer': '43.9'
    }, 
    ...
}

一旦你有了这个,你就可以得到你需要的任何值并执行你的计算。请参阅下面的代码。

def read_data(filename: str) -> dict:
    with open(filename, 'r') as file:
        next(file) # Skip the header
        data = dict();
        for line in file:
            cleaned_line = line.rstrip()
            # Skip blank lines
            if cleaned_line: 
                data_item = (cleaned_line.split(','))
                data[data_item[0]] = float(data_item[1])
    return data


# Load data into python dictionaries
smokers_data = read_data('smokersData.txt')
cancer_data = read_data('lungCancerData.txt')


# Build one dictionary that is easy to work with
smokers_cancer_data = dict()
for (key, value) in smokers_data.items():
    if key in cancer_data:
        smokers_cancer_data[key] = {
            'smokers': smokers_data[key],
            'cancer' : cancer_data[key]  
        }

print(smokers_cancer_data)

例如,如果您要计算吸烟者和癌症值的总和。

smokers_total = 0
cancer_total = 0
for (key, value) in smokers_cancer_data.items():
    smokers_total += value['smokers']
    cancer_total += value['cancer']

【讨论】:

    【解决方案2】:

    这将返回所有有数据的国家的列表以及数据:

    l3 = []
    with open('smoking.txt','r') as f1, open('cancer.txt','r') as f2:
        l1, l2 = f1.readlines(), f2.readlines()
    
    for s1 in l1:
        for s2 in l2:
            if s1.split(',')[0] == s2.split(',')[0]:
                cty = s1.split(',')[0]
                smk = s1.split(',')[1].strip()
                cnr = s2.split(',')[1].strip()
                l3.append(f"{cty}: smoking: {smk}, cancer: {cnr}")
    
    print(l3)
    

    输出:

    ['Spain: smoking: 77.9, cancer: 17', 'Russia: smoking: 60.8, cancer: 23.7', 'America: smoking: 73.3, cancer: 23.3', 'Italy: smoking: 43.9, cancer24.2']
    

    【讨论】:

    • 但这不是我想要的
    • 我想我们应该使用其他东西而不是附加。因为 append 只接受一个参数
    猜你喜欢
    • 2013-04-29
    • 1970-01-01
    • 2013-04-27
    • 2016-04-07
    • 1970-01-01
    • 1970-01-01
    • 2014-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多