2015-11-04 54 views
2

比方说,你有这样的情况:是否有一系列一次性变量的简写语法?

_, _, _, substring_1, _, substring_2 = some_string.split(',') 

是否有表达的前三个连续的下划线,表示要丢弃的值的简写方式?我特别想知道是否存在这样的句法快捷方式,而不是完成相同任务的各种方式。

编辑 - 我对Python 2.7特定的答案感兴趣。

+1

Python的哪个版本? – jonrsharpe

+0

@jonrsharpe - python 2.7 – Boa

+2

这是一个很好的语法,我在Prolog中非常享受。我喜欢用Python做它,但据我所知(至少在Python 2中),下划线是一个普通变量,不是该语言的真正特征,编码人员将它用作可抛出变量的约定。此外,似乎有很好的理由使用__(两个下划线)而不是_(请参阅http://docs.python-guide.org/en/latest/writing/style/) –

回答

4

不是语法捷径,但你可能想使用itemgetter函数从operator模块:

from operator import itemgetter 
my_pair = itemgetter(3, 5) 
substring_1, substring_2 = my_pair(some_string.split(',')) 

或者定义my_pair换到split以及呼叫:

def my_pair(x): 
    return itemgetter(3,5)(x.split(',')) 

substring_1, substring_2 = my_pair(some_string) 
+0

谢谢,但我特别好奇关于这种捷径是否存在的问题。 – Boa

+0

没有一个。 – chepner

+0

实际上,有几个 - [见乔恩的答案](http://stackoverflow.com/a/33528427/135978) –

5

您可以仅使用str.rsplit并提供限制:

>>> s = 'a,b,c,d,e,f' 
>>> s.rsplit(',', 3) # i.e. split on at most three commas, from the right 
['a,b,c', 'd', 'e', 'f'] 
>>> _, d, _, f = s.rsplit(',', 3) 
>>> d 
'd' 
>>> f 
'f' 

如果升级到Python 3.x中,你可以使用*_吸收元素任意数量的(你会得到一个2.X SyntaxError,虽然):

>>> *_, d, _, f = s.split(',') 
>>> d 
'd' 
>>> f 
'f' 
2

是,如果你正在使用Python 3 你不在乎是否有多于或少于3项前的最后3:

*_, first, _, second = somestring.split(',') 

否则,如果你想最后个3个元素(不管有多少项的字符串有),可以使用str.rsplitJon points out

_, first, _, second = s.rsplit(',', 3) 

如果你想在第3和第5元素(无论字符串有多少个元素了),你可以使用chepner's answer

from operator import itemgetter 

extract = itemgetter(3, 5) 
first, second = extract(s.split(',')) 

最后,如果必须在字符串中六个条目,最好的办法是要明确:

KeyFields = namedtuple('KeyFields', 'first second') 

def extract_key_fields(s): 
    data = s.split(",") 
    if len(data) != 6: 
     raise ValueError("Must provide six fields") 
    return KeyFields(data[3], data[5]) 

key_fields = extract_key_fields(somestring) 
key_fields.first # d 
key_fields.second # f 
+0

谢谢 - upvote的答案。我应该指定我对Python 2.7中的这一点感兴趣。我已经编辑了相应的问题。 – Boa

相关问题