
1 j0hnj 2018-03-17 17:35:33 +08:00 一个笨办法,但是能实现你的要求 def flatten(l): ret = [] for elem in l: if isinstance(elem, list): ret.extend(flatten(elem)) else: ret.append(elem) return ret def reconstruct(l): inner = [l[0]] for elem in l[1:]: inner = [elem, inner] return inner if __name__ == '__main__': print(reconstruct(flatten(['a', ['b', ['c', ['d', ['e', ['f']]]]]]))) |
2 j0hnj 2018-03-17 17:37:38 +08:00 排版乱了…看这里吧 https://paste.ubuntu.com/p/5F27Gybh4F/ |
3 whileFalse 2018-03-17 17:46:57 +08:00 source = ('a',('b',('c',('d',('e',('f')))))) target = None while True: target = (source[0],) if target is None else (source[0], target) if len(source) == 2: source = source[1] else: break print(target) |
4 noNOno 2018-03-17 17:51:07 +08:00 替换掉字符串包含的括号,按字符串内字母(a,b,c,d,e,f)的字典顺序倒排,再按字符串长度加上括号,可以么 |
5 koplyp OP 感谢各位大佬,学习了 |
6 jorneyr 2018-03-17 18:09:06 +08:00 前后一起搜索,找到一对字符进行交换,然后继续搜索 |
7 haozhang 2018-03-17 18:32:30 +08:00 via iPhone 双栈运算了解一下 |
8 summerwar 2018-03-17 18:43:11 +08:00 import re a = '(a,(b,(c,(d,(e,(f))))))' re.sub(r'\((.*?),\((.*?),\((.*?),\((.*?),\((.*?),\((.*?)\)\)\)\)\)\)',r'(\6,(\5,(\4,(\3,(\2,(\1))))))',a) |
9 ballshapesdsd 2018-03-17 18:47:26 +08:00 @summerwar #8 万一不是 6 个呢 |
10 summerwar 2018-03-17 18:58:39 +08:00 |
11 yeeling 2018-03-17 19:11:16 +08:00 let a = '(a,(b,(c,(d,(e,(f))))))'; rst = a.substr(0,a.indexOf(')')).split(',').reverse().join(',') + a.substr(a.indexOf(')')); console.log(rst); 这样呢 |
12 l1093178 2018-03-17 19:38:41 +08:00 ast.parse 了解一下? |
13 rrfeng 2018-03-17 19:55:31 +08:00 不是双栈,是一个队列的事儿 |
14 az422 2018-03-17 20:39:50 +08:00 via Android 当作一个字符串,从头开始遍历,用数组 arr 记下字母的值。 再次遍历,判断是字母则反向插入 arr 各个值。 |
15 xrlin 2018-03-17 21:04:12 +08:00 via iPhone 楼上正解 |
16 SeanChense 2018-03-17 21:40:36 +08:00 入栈的时候去掉括号,再出栈配上括号就行了。 |
17 contmonad 2018-03-17 22:43:50 +08:00 via iPhone 任何函数式语言都自带这个操作:reverse |
18 gowl 2018-03-17 22:47:13 +08:00  |
19 gowl 2018-03-17 22:49:54 +08:00 |
20 gowl 2018-03-17 22:52:01 +08:00 |
21 gowl 2018-03-17 22:52:39 +08:00 谁教教我插图片啊 >< |
22 gowl 2018-03-17 22:56:44 +08:00 <img src="https://i.loli.net/2018/03/17/5aad2b85743e9.png"> |
23 gowl 2018-03-17 22:59:20 +08:00 <img src="https://i.loli.net/2018/03/17/5aad2b85743e9.png" class="embedded_image"> |
24 gowl 2018-03-17 23:09:04 +08:00 然后再用 Python 写一个 lisp 解释器就可以了;) |
25 vegito2002 2018-03-17 23:13:23 +08:00 这个就是一个单链表反转, 不用栈操作, 直接把字母全都提取出来, 倒序, 然后加括号就行了, 你看你的输出, 除了最后的右括号, 左边的实际上就是一个简单的循环结构, 一个 for loop 完成 (f,(e,(d,(c,(b,(a, 去掉最后一个逗号, 然后加上对应数量的右括号就行了; |
26 gbin 2018-03-17 23:39:57 +08:00 |
27 gbin 2018-03-18 00:05:44 +08:00 via Android @whileFalse 求详解,get 不到重点。 |
28 contmonad 2018-03-18 00:07:18 +08:00 为什么你们都把输入当做字符串,不是 tuple 吗?如果允许稍微改一下题目,在最后加一个 nil 就很简单了: l = ('a', ('b', ('c', ('d', ('e', ('f', ())))))) acc = () while l: acc, l = (l[0], acc), l[1] |
30 ballshapesdsd 2018-03-18 00:34:59 +08:00 @contmonad 完美 |
31 imn1 2018-03-18 00:54:20 +08:00 1.正则提取->列表 A 2.A 倒序->B 3.AB zip ->二维列表 C 4.替换 C (有需要的话用正则) 有需要的 escape 一下 数据源非字符串的话,可以借用 json 过渡 |
32 coffeSlider 2018-03-18 01:15:04 +08:00 import re def wtf(s): return re.sub('\w', '{}', s).format(*[i for i in s[::-1] if i.isalpha()]) "Life is short" |
33 aokihu 2018-03-18 01:36:36 +08:00 via Android 这个不是二叉树么! |
34 animal 2018-03-18 01:39:42 +08:00 via Android 我怎么觉得应该把这串字符转换成树形结构,用中序或者后序遍历 |
35 aminic 2018-03-18 03:01:17 +08:00 via Android 递归就可以吧 |
36 nicktogo 2018-03-18 05:17:19 +08:00 via iPhone two pointer ? |
37 qq529633582 2018-03-18 05:48:20 +08:00 >>> def reverse(a): ... f = (lambda x, y : (x[0],y) if len(x)==1 else f(x[1], (x[0],y))) ... return f(a[1], (a[0],)) ... >>> reverse(('a',('b',('c',('d',('e',('f',))))))) ('f', ('e', ('d', ('c', ('b', ('a',)))))) |
38 lemontv 2018-03-18 06:08:30 +08:00 |
39 woodo 2018-03-18 08:56:03 +08:00 >>> n=ord('f')-ord('a') >>> for x in s: ... if x in string.ascii_letters: ... print(chr(ord(x)+n), end=''); n-=2 ... else: print(x,end='') ... print() |
40 realpg PRO |
41 param 2018-03-18 10:12:12 +08:00 via Android |
42 shwomen1234fs 2018-03-18 10:15:26 +08:00 print(reduce(lambda a, b: "({},({}))".format(str(b), str(a)), "(a,(b,(c,(d,(e,(f))))))".replace("(", "").replace(")", "").split(","))) |
43 shwomen1234fs 2018-03-18 10:21:11 +08:00 print("({})".format(reduce(lambda a, b: "{},({})".format(b, a), "(a,(b,(c,(d,(e,(f))))))".replace("(", "").replace(")", "").split(",")))) |
44 SolidZORO 2018-03-18 10:53:29 +08:00 写个有可读性的。 ``` const source = '(a,(b,(c,(d,(e,(f))))))'; const sourceList = source.split(''); const charList = []; const keyList = []; // Find Char & Key sourceList.map((char, i) => { if (/[a-z]/i.test(char)) { charList.push(char); keyList.push(i); } }); // Replace sourceList String keyList.map((key, i) => { sourceList[key] = charList.reverse()[i]; }); // (a,(b,(c,(d,(e,(f)))))) console.log(source); // (f,(b,(d,(d,(b,(f)))))) console.log(sourceList.join('')); ``` https://gist.github.com/SolidZORO/d30fdac96fd00af1be9b77e2c64ab9fa |
45 SolidZORO 2018-03-18 10:58:42 +08:00 via iPhone ♂ 看了下节点,JS 代码误入。 |
46 jazoma 2018-03-18 11:47:57 +08:00 from functools import reduce def f(ys,s=[]): x,xs = ys if type(xs) != tuple: return reduce(lambda x,y: (y,(x)), s+[x,xs]) return f(xs,s+[x]) |
47 jazoma 2018-03-18 11:53:03 +08:00 -from functools import reduce - -def f(ys,s=[]): -----x,xs = ys -----if type(xs) != tuple: ---------return reduce(lambda x,y: (y,(x)), s+[x,xs]) -----return f(xs,s+[x]) |
48 aec4d 2018-03-18 12:02:33 +08:00 a = ('a', ('b', ('c', ('d', ('e', ('f')))))) from functools import reduce def reverse(T): ret = [] while len(T) != 1: ret.append(T[0]) T = T[-1] ret.append(T[0]) return reduce(lambda x, y: (y, x), ret) x = reverse(a) print(x) |
49 hourann 2018-03-18 13:12:52 +08:00 via iPhone |
50 epicnoob 2018-03-18 13:55:24 +08:00 大神真多。 |
51 think2011 2018-03-18 15:24:18 +08:00 乱入一个 Javascript 的 版本.. ```js const str = '(a,(b,(c,(d,(e,(f))))))' const tmp = str.match(/\w/g) str.replace(/\w/g, $1 => tmp.pop()) ``` |
52 lovefantasy 2018-03-18 16:49:53 +08:00 via Android 大佬们秀的我头晕 |
53 sun1991 2018-03-18 18:07:24 +08:00 感觉歪了啊, 这题考的应该是 lexer 方面的知识吧? |
55 ch3nOr 2018-03-18 21:31:56 +08:00 当成链表 <script src="https://gist.github.com/3vilive/f1ee3e138a121e7d203ed827c67caf4c.js"></script> |
56 yankebupt 2018-03-18 22:02:26 +08:00 如果没有特殊规定一般情况怎么处理的话, 我觉得是递归查找最内侧的括号,然后一层一层往外翻,每翻一层,然后把原来内部括号外侧的的元素括起来,替换掉递归层... 这样改过顺序的 ((((((f),e),d),c),b),a) 大概会翻成 ((((((a),b),c),d),e),f) 不知猜的对不对... 上面代码比较多,有可能有满足这个的代码没看到,提前抱歉 |
57 no1xsyzy 2018-03-18 23:11:06 +08:00 我其实就想知道问题到底是什么。 输入 /输出 的到底是 字符串 /多层列表? 另外,中间有一处出现 3 个的话怎么办?换句话说 (a,b,(c))=>? 如果是按考试风格题目,输入输出均为多层列表,无异常情况,不就是个 reverse 么(把 list 看作 cons ) def mdreverse(inp, sav=[]): if len(inp) == 0: return sav car, cdr, *_ = inp+[[]] return multireverse(cdr, [car, sav] if sav else [car]) mdreverse([1,[2,[3]]]) # [3, [2, [1]]] mdreverse([1]) # [1] mdreverse([1,[2,[3,[4,[5,[6]]]]]]) # [6, [5, [4, [3, [2, [1]]]]]] mdreverse([]) # [] |
58 Antidictator 2018-03-19 08:59:11 +08:00 @gowl #24 用 imgur 的图可以,你这个好像经常不行 |
59 yangfch3 2018-03-19 09:46:00 +08:00 正则表达式的平衡组专门用于解决这种 nested 结构的解析等问题,了解一下 正则:\([^\)]*[^\(\)]*(((?'Open'\([^\(]*)[^\(\)]*)+((?'-Open'\)))+)*(?(Open)(?!)) 源文本:(a,(b,(c,(d,(e,(f)))))) 匹配结果:(a,(b,(c,(d,(e,(f 拿到匹配结果再处理、reverse 前提是你的运行环境的正则引擎支持平衡组 |
60 araraloren 2018-03-19 10:59:04 +08:00 @think2011 awesome ! Give u ten B. |
61 fortunezhang 2018-03-19 14:33:22 +08:00 str1 = '(a,(b,(c,(d,(e,(f,g)))))))' str1 = str1.replace(')', ' ').replace('(', ' ').replace(',', ' ') str1 = str1[::-1].split() str1 = '(' + ',('.join(str1) + ')' * len(str1) print(str1) |
62 gowl 2018-03-19 16:27:54 +08:00 @Antidictator 多谢~ |
63 gowl 2018-03-19 16:29:33 +08:00 |
64 gowl 2018-03-19 16:30:15 +08:00 |
67 tihiro 2018-03-20 19:50:43 +08:00 def get_elements(s): q = [] while len(s) != 1: q.append(s[0]) s = s[1] q.append(s) return q def nested_list(l): res = () ele0 = l[0] res += (ele0, ) l.remove(ele0) if len(l) > 0: res += ((nested_list(l), )) return res def main(): s = ('a', ('b', ('c', ('d', ('e', ('f')))))) l = get_elements(s) l = l[::-1] ll = nested_list(l) print(ll) if __name__ == '__main__': main() |
68 xiongshengyao 2018-03-26 15:42:41 +08:00 最简单的思路…一个队列一个栈 ``` def main(source_str): el = [] ret = [] for i in source_str: if i not in ('(', ',', ')'): el.append(i) ret.append("#") else: ret.append(i) for index, value in enumerate(ret): if value == "#": ret[index] = el.pop() return "".join(ret) if __name__ == "__main__": result = main("(a,(b,(c,(d,(e,(f))))))") print(result) ``` |