python 数据单元的变化替换

‘’’
数据单元的变化替换

将一个 csv 格式的数据文件中包含有单元格引用的内容替换为对应单元格内容的实际值。

comma separated values(CSV) 逗号分隔值,csv 格式的数据文件使用逗号 “,” 作为分隔符将各单元的内容进行分隔。
输入描述

输入只有一行数据,用逗号分隔每个单元格,行尾没有逗号。最多26个单元格,对应编号A~Z。

每个单元格的内容包含字母和数字,以及使用 '<>' 分隔的单元格引用,例如:<A>表示引用第一个单元的值。

每个单元格的内容,在替换前和替换后均不超过100个字符。

引用单元格的位置不受限制,允许排在后面的单元格被排在前面的单元格引用。

不存在循环引用的情况,比如下面这种场景是不存在的:

A单元恪:aCd<B>8U

B单元格:KAy<A>uZq0

不存在多重 '<>' 的情况,一个单元只能引用一个其他单元格。比如下面这种场景是不存在的:

A单元格:aCdOu

B单元格:kAydzco

C单元格:y<<A><B>>d

输出描述

输出替换后的结果’‘’
#算法:并查集,不可以,因为并后,所在的节点不一定是纯数字字母
下面是错误的结果

# import re
# def shujudanyuan(s):
#     s = s.split(',')
#     fa = [[i,s[i]] for i in range(len(s))]
#     def find_set(p):
#         if fa[p][0]!=p:
#             fa[p][0] = find_set(fa[p][0])
#             return fa[p][0]
#         else:
#             return fa[p][0]
#     def union_set(m,n):
#         if find_set(m)!=find_set(n):
#
#             fa[find_set(m)][0]=find_set(n)
#
#     for i in range(len(fa)):
#         if not re.search(r'<',fa[i][1]) and not re.search('>',fa[i][1]):
#             continue
#         elif len(re.findall('<[A-Z]>',fa[i][1]))==1 and  len(re.findall('<',fa[i][1]))==1 and len(re.findall('>',fa[i][1]))==1:
#             n,m=re.search('<[A-Z]>',fa[i][1]).span()
#
#             union_set(ord(fa[i][1][n+1:m-1])-ord('A'),i)
#         else:
#             return -1
#     print(fa)
#     for i in range(len(fa)):
#         temps=fa[find_set(fa[i][0])][1]
#         re.sub('<[A-Z]>',fa[i][1],temps)
#     return ','.join([x[1] for x in fa])
#
# print(shujudanyuan('1,2<A>00'))

#算法:深度遍历,数据结构是一个有向无环的图
正确结果

import re
def shujudanyuan(s):
    s = s.split(',')
    fa=[0 for _ in range(len(s))]
    stack=[]
    def dfs(index):
        if len(re.findall('<[A-Z]>', s[i])) == 1 and len(re.findall('<', s[i])) == 1 and len(
                re.findall('>', s[i])) == 1 or not re.search(r'<', s[i]) and not re.search('>', s[i]):
            valid = 1
        else:
            valid=0
        if not valid:
            return 1/0
        fa[index]=1
        if not re.search('<[A-Z]>', s[index]):
            return s[index]
        else:
            n, m = re.search('<[A-Z]>', s[index]).span()
            newindex=ord(s[index][n+1:m-1])-ord('A')
            stack.append(index)
            temp=dfs(newindex)
            s[index]=re.sub('<[A-Z]>',temp,s[index])
            stack.pop()
            return temp


    for i in range(len(s)):
        if not fa[i]:
            try:
                dfs(i)
            except:
                return -1

    return ','.join(s)
print(shujudanyuan('1<B>2,1,1<B>2,1<B>2,1<D>2,1<B>2,1<C>2,<B>,1<F>2,1<B>2,1<B>2'))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值