求助各位大神, 如何将(a,(b,(c,(d,(e,(f))))))转换为(f,(e,(d,(c,(b,(a))))))

2018-03-17 16:21:41 +08:00
 koplyp
8202 次点击
所在节点    Python
68 条回复
param
2018-03-18 10:12:12 +08:00
差一点,
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(",")))
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(","))))
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
SolidZORO
2018-03-18 10:58:42 +08:00
🤦‍♂️ 看了下节点,JS 代码误入。
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])
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])
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)
hourann
2018-03-18 13:12:52 +08:00
epicnoob
2018-03-18 13:55:24 +08:00
大神真多。
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())
```
lovefantasy
2018-03-18 16:49:53 +08:00
大佬们秀的我头晕
sun1991
2018-03-18 18:07:24 +08:00
感觉歪了啊, 这题考的应该是 lexer 方面的知识吧?
xpresslink
2018-03-18 20:56:16 +08:00
@aokihu 你去看看 lisp 或者 sicp 这个就是链表的实现
ch3nOr
2018-03-18 21:31:56 +08:00
yankebupt
2018-03-18 22:02:26 +08:00
如果没有特殊规定一般情况怎么处理的话, 我觉得是递归查找最内侧的括号,然后一层一层往外翻,每翻一层,然后把原来内部括号外侧的的元素括起来,替换掉递归层...
这样改过顺序的
((((((f),e),d),c),b),a) 大概会翻成 ((((((a),b),c),d),e),f)
不知猜的对不对...
上面代码比较多,有可能有满足这个的代码没看到,提前抱歉
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([]) # []
Antidictator
2018-03-19 08:59:11 +08:00
@gowl #24 用 imgur 的图可以,你这个好像经常不行
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

前提是你的运行环境的正则引擎支持平衡组
araraloren
2018-03-19 10:59:04 +08:00
@think2011 awesome ! Give u ten B.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/438930

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX