是否有一系列一次性变量的简写语法?

时间:2015-11-04 17:32:33

标签: python-2.7

让我们说你有这样的情况:

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

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

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

3 个答案:

答案 0 :(得分: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'

答案 1 :(得分:4)

不是语法快捷方式,但您可能希望使用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) 的调用:

- (void)viewDidLoad {
    [super viewDidLoad];
    NSFileManager *manager = [[NSFileManager alloc] init];    // Do any additional setup after loading the view.
    [manager setDelegate:self];


    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0]; // Get documents folder

    [manager changeCurrentDirectoryPath:documentsDirectory];
}

- (BOOL)fileManager:(NSFileManager *)fileManager shouldMoveItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath{
    NSLog(@"Attempt to move");
    return YES;
}

答案 2 :(得分:2)

是的,如果你使用的是Python 3 ,那么你不关心在最后3个之前是否有多于或少于3个条目:

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

否则,如果您想要 last 3个元素(无论字符串有多少条目),您可以str.rsplit使用Jon 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