将列表项匹配到同一列表另一端的项目?

Gra*_*ham 3 python awk

我有一个任意偶数项目的列表.

输入数据:

Red
Orange
Yellow
Green
Blue
Violet
Run Code Online (Sandbox Code Playgroud)

输出数据:

Red -> Violet
Violet -> Orange
Orange -> Blue
Blue -> Yellow
Yellow -> Green
Green -> Red
Run Code Online (Sandbox Code Playgroud)

我的想法是,最高的项目与最低的项目匹配,我想有点从堆栈的两端弹出一些东西.一旦堆栈用完,最后剩下的匹配就是我们开始使用的任何东西.

我从这开始:

awk '{a[NR]=$0} END {for (i=1;i<=NR;i++) {printf("%s -> %s\n",a[i],a[NR-i+1])}}'
Run Code Online (Sandbox Code Playgroud)

它匹配从顶部到底部,但不"弹出".

这有可能在awk?

注意:我已经标记了这个"python",因为虽然我没有任何线索如何在python中执行此操作,但我非常知道,如果它比awk答案更优雅,它将接受python答案.:-)

And*_*ark 5

这是一个Python解决方案:

data = ['Red', 'Orange', 'Yellow', 'Green', 'Blue', 'Violet']
first = data[0]
while data:
    a, b = data[0], data[-1]
    data = data[1:-1]
    print '{} -> {}'.format(a, b)
    print '{} -> {}'.format(b, data[0] if data else first)
Run Code Online (Sandbox Code Playgroud)

这里的起点是数据列表,如果需要从文件中读取输入,可以使用以下命令填充data:

data = [line.strip() for line in open(filename)]
Run Code Online (Sandbox Code Playgroud)

如果要从stdin读取数据,可以使用以下命令:

import sys
data = [line.strip() for line in sys.stdin]
Run Code Online (Sandbox Code Playgroud)

要从列表的开头和结尾有效删除,请使用collections.deque.如果您从stdin读取,这将是这样的:

import sys
import collections

data = collections.deque(line.strip() for line in sys.stdin)
first = data[0]
while data:
    a, b = data.popleft(), data.pop()
    print '{} -> {}'.format(a, b)
    print '{} -> {}'.format(b, data[0] if data else first)
Run Code Online (Sandbox Code Playgroud)

  • `data = [line.strip()for sys.stdin中的行]`.不需要`readlines`. (2认同)