Python一道华为面试题,看起来简单,结果跑起来不能实现。有想法的坛子朋友进来看看

一速微光 2018-02-04 08:19:05
[name]
1 2 3
1 2 4

[cribe]
;id node1 node2
110 1-A 1-B
111 2-A 2-B
112 3-A 3-B
113 4-A 4-B
.......节省篇幅

[detail]
;id node1 node2 lengh
p3 1-A 2110 400
P4 2115 1-B 200
p1 2-A 2132 100
p2 2001 2-B 200
...... 节省篇幅

txt文件内容如上,需求是这样的,从[cribe]里面取出来每一行node1和node2的值,如果可以在[detail]里面也有对应的node1和node2的值就

删除行,然后合并[detail]里面的内容(用[cribe]每一行node1和node2的值合并[detail]的2行数据,且lengh相加合并)。具体效果是
[detail]
;id node1 node2 lengh
110 2115 2110 600
111 2001 2132 300
就是用[cribe]里的id值替换[detial]里面的id合并后的值。





...全文
1733 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
ggeneral2 2018-12-21
  • 打赏
  • 举报
回复
这题目的表述让人不适.
臭豆腐儒 2018-02-07
  • 打赏
  • 举报
回复
都是大神
虾米馅煎包 2018-02-05
  • 打赏
  • 举报
回复
逻辑倒是还好 就是各种百度基础代码 弄了快2个小时才弄好 特别是文件读写,和基础类型替换 = =
还是先放结果图吧 (ps: p7 4-A 2856 200这行测试多余测试用)

最后代码奉上

with open(r'info.txt','r') as f:
lists = f.read().split('\n[')

#当我看到这个txt时 就想到了二维数组 因为很好遍历和比较
cribe_list = lists[1].replace('\n',' ').split(' ')
cribe_2d = [['*' for j in range(3)]for i in range(int((len(cribe_list)-4)/3))]
num = 0
j = 0
for i in cribe_list[4:]:
if num == 3:
num = 0
j+=1
cribe_2d[j][num] = i
num +=1
print(cribe_2d)

detail_list = lists[2].replace('\n',' ').split(' ')
detail_2d = [['*' for j in range(4)]for i in range(int((len(detail_list)-5)/4))]
num = 0
j = 0
for i in detail_list[5:]:
if num == 4:
num = 0
j+=1
detail_2d[j][num] = i
num +=1
print(detail_2d)

#思路:其实就是直接比较 先找第一个有了再找第二个 没有什么好说的。。。
new_list = []
for i in range(len(cribe_2d)):
for j in range(len(detail_2d)):
# print("i:",i,cribe_2d[i][1],"j:",j,detail_2d[j][1])
if cribe_2d[i][1] == detail_2d[j][1]:
new_id = cribe_2d[i][0]
new_node2 = detail_2d[j][2]
for n in range(len(detail_2d)):
# print("i:",i,"n:",n)
if cribe_2d[i][2] == detail_2d[n][2]:
new_length = int(detail_2d[j][3])+int(detail_2d[n][3])
new_node1 = detail_2d[n][1]
# print(new_id,new_node1,new_node2,new_length)
new_list.append([new_id,new_node1,new_node2,str(new_length)])
#删除行的时候需要比较哪行在前,不然会删错。
if(j<n):
del detail_2d[j]
del detail_2d[n-1]
else:
del detail_2d[n]
del detail_2d[j-1]
break
break

fina_list = new_list+detail_2d
fina_text = str(fina_list).replace('\', \'',' ').replace('[[\'',"").replace('\']]',"").replace(r"'], ['","\n")
print(fina_text)

with open(r'info.txt','r') as f1:
lines = f1.readlines()
with open(r'info2.txt','w') as f2:
for line in lines:
#当读到这行中有p时跳过
if 'p' in line:
continue
f2.write(line)
f2.write(fina_text)
混沌鳄鱼 2018-02-05
  • 打赏
  • 举报
回复
我把主要的算法写了一下,大概用了20分钟吧,没太仔细想, 写入文件的细节你自己弄一下吧。

import csv
from operator import itemgetter
from collections import OrderedDict

with open('cribe.txt') as cf, open('detail.txt') as df:
    cribe_list = list(csv.reader(cf, delimiter='\t'))[1:]
    detail_list = list(csv.reader(df, delimiter='\t'))[1:]

node1_index = dict(map(itemgetter(1,0),cribe_list))
node2_index = dict(map(itemgetter(2,0),cribe_list))

print(node1_index)
print(node2_index)

result = OrderedDict()
for line in detail_list:
    node_id = node1_index.get(line[1], False)
    if node_id:
        result.setdefault(node_id, {}).update({'n1':line[2],'l1':int(line[-1])})

    node_id = node2_index.get(line[2], False)
    if node_id:
        result.setdefault(node_id, {}).update({'n2':line[1],'l2':int(line[-1])})

for node_id, values in result.items():
    print(node_id, values['n1'], values['n2'], values['l1']+values['l2'])

======================= RESTART: D:/tmp/handlefile.py ======================= {'1-A': '110', '2-A': '111', '3-A': '112', '4-A': '113'} {'1-B': '110', '2-B': '111', '3-B': '112', '4-B': '113'} 110 2110 2115 600 111 2132 2001 300
混沌鳄鱼 2018-02-05
  • 打赏
  • 举报
回复
用数据库相对来说也比较容易

import csv
import sqlite3

with open('cribe.txt') as cf, open('detail.txt') as df:
    cribe_list = list(csv.reader(cf, delimiter='\t'))[1:]
    detail_list = list(csv.reader(df, delimiter='\t'))[1:]

con = sqlite3.connect(":memory:")
# 使用:memory:标识,数据库放在内存里,不产生磁盘文件。
cur = con.cursor()

cur.execute('CREATE TABLE cribe(id INT PRIMARY KEY NOT NULL, node1 TEXT, node2 TEXT);')
cur.execute('CREATE TABLE detail(id TEXT, node1 TEXT, node2 TEXT, length INT);')

cur.executemany('INSERT INTO cribe(id, node1, node2) VALUES(?,?,?);', cribe_list)
cur.executemany('INSERT INTO detail(id, node1, node2, length) VALUES(?,?,?,?);', detail_list)

rows = cur.execute("""SELECT N1.id, N2.node1, N1.node2, N1.length + N2.length AS length
FROM
(SELECT C.id, D.node2 AS node2, D.length FROM detail AS D INNER JOIN cribe AS C ON C.node1 = D.node1) AS N1
INNER JOIN
(SELECT C.id, D.node1 AS node1, D.length FROM detail AS D INNER JOIN cribe AS C ON C.node2 = D.node2) AS N2
ON N1.id = N2.id;""")

for row in rows:
    print(row)


(110, '2115', '2110', 600) (111, '2001', '2132', 300)
混沌鳄鱼 2018-02-04
  • 打赏
  • 举报
回复

37,718

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧