在我问之前,我用谷歌搜索了一下,但找不到答案。
我的场景是这样的:将一个数字列表传递给脚本,\n-通过文件分隔,或者通过命令行arg以逗号分隔。数字可以是单数,也可以以块为单位,如下所示:
文件:
1
2
3
7-10
15
20-25
命令行参数:
1, 2, 3, 7-10, 15, 20-25
两者最终都在同一个list[]中。我想扩展7-10或20-25块(在实际脚本中,这些数字显然会有所不同),并将它们附加到一个新的列表中,最终列表如下:
['1','2','3','7','8','9','10','15','20','21','22','23','24','25']
我知道像.append(range(7,10))这样的东西可以在这里对我有所帮助,但我似乎找不到原始list[]中哪些元素需要扩展。
所以,我的问题是:给定一个list[]:
['1','2','3','7-10','15','20-25'],
如何获取list[]:
['1','2','3','7','8','9','10','15','20','21','22','23','24','25']
发布于 2015-05-13 04:52:36
让我们假设你得到了这个列表:
L = ['1','2','3','7-10','15','20-25']
并且您希望扩展其中包含的所有范围:
answer = []
for elem in L:
if '-' not in elem:
answer.append(elem)
continue
start, end = elem.split('-')
answer.extend(map(str, range(int(start), int(end)+1)))
当然,这里有一个很方便的一行代码:
answer = list(itertools.chain.from_iterable([[e] if '-' not in e else map(str, range(*[int(i) for i in e.split('-')]) + [int(i)]) for e in L]))
但这利用了python2.7中泄漏变量的性质,我认为这在python3中不起作用。而且,这不是最具可读性的代码行。所以如果我是你,我不会在生产中使用它...除非你真的恨你的经理。
参考资料:append()
continue
split()
extend()
map()
range()
list()
itertools.chain.from_iterable()
int()
发布于 2015-05-13 05:06:52
输入:
arg = ['1','2','3','7-10','15','20-25']
输出:
out = []
for s in arg:
a, b, *_ = map(int, s.split('-') * 2)
out.extend(map(str, range(a, b+1)))
或者(在Python 2中):
out = []
for s in arg:
r = map(int, s.split('-'))
out.extend(map(str, range(r[0], r[-1]+1)))
发布于 2015-05-13 07:15:32
很好的旧map + reduce将会派上用场:
>>> elements = ['1','2','3','7-10','15','20-25']
>>> reduce(lambda original_list, element_list: original_list + map(str, element_list), [[element] if '-' not in element else range(*map(int, element.split('-'))) for element in elements])
['1', '2', '3', '7', '8', '9', '15', '20', '21', '22', '23', '24']
好的,这样就行了,除了你想让20-25也包含25...所以更多的汤来了:
reduce(
lambda original_list, element_list: original_list + map(str, element_list),
[[element] if '-' not in element
else range(int(element.split('-')[0]), int(element.split('-')[1]) + 1)
for element in elements])
现在,即使这样可以工作,使用一些for循环可能会更好。这就是为什么他们在Python3中删除了reduce的原因。
https://stackoverflow.com/questions/30201119
复制相似问题