Python在列表中搜索部分匹配项

时间:2019-02-15 14:35:48

标签: python list set match

我在解决解决此问题的逻辑时遇到问题。我有一个看起来像这种格式的列表:

['blah', 'foo', 'bar', 'jay/day']

没有'/'的任何东西都是正常名称。任何带有'/'字符的内容都是名称+附加字符串。我想要做的是遍历一组元组,并检查元组的第一个元素是否与列表中的任何名称匹配。但是,我也希望名称“ jay”与“ jay / day”匹配,但我不希望部分匹配(即,不希望“ ja”与“ jay”部分匹配)。

基本上,我想要一个名称的完全匹配,而忽略单个条目中“ /”后的任何内容。

在弄清其逻辑方面的任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:1)

采用传统的循环方式。这将元组中的名称与lst中的名称匹配:

$router->group(['prefix' => 'api', 'namespace' => 'API'], function 
  () use ($router) {
    /* Check Ins */
    $router->post('checkin', 'CheckInController@store');

   /* Payment Status */
   $router->get('payments/status', 'PaymentStatusController@index');

   /* Vehicle Categories */
    $router->get('vehicles/categories', 
   'VehicleCategoryController@index');

    /* Parking Areas */
    $router->get('parking/areas', 'ParkingAreaController@index');

    /* Parking Types*/
    $router->get('parking/types', 'ParkingTypeController@index');

    /* Vehicles */
    $router->get('vehicles', 'VehicleController@index');
    $router->get('vehicles/{vehicleRegistrationNumber}', 
    'VehicleController@show');
});
// Above are the routes
// Mutator on my model
public function setParkingStartTimeAttribute($value)
{
    $this->attributes['parking_start_time'] = 
    Carbon::createFromFormat($value);
}
// Action in Controller
public function store(Request $request)
{
    $this->validateCheckInRequest($request);
    $parkingStartTime = Carbon::createFromFormat('Y-m-d H:i:s', 
    $request->parking_start_time);

    return response()->json($parkingStartTime); // for testing purposes when i return this it gives me the result below
    $checkIn = CheckIn::create($request->all());
    return new CheckInCollection($checkIn);
}

// Result given when i return the parking_start_time
{
  "date": "-0001-11-30 21:27:00.000000",
  "timezone_type": 3,
  "timezone": "UTC"
}

答案 1 :(得分:1)

您不必每次都遍历列表并用'/'分隔,而只需将列表复制到仅包含'/'之前的内容的新列表即可。

input_tuples = [('jay', 'other'), ('blah', 'other stuff')]
list_strings = ['blah', 'foo', 'bar', 'jay/day']

# Using a set as @Patrick Haugh suggested for faster look up
new_strings = {x.split('/')[0] for x in list_strings}

for tup in input_tuples:
    if tup[0] in new_strings:
        print('found', tup[0]) 
# outputs found jay, found blah

答案 2 :(得分:0)

为简单起见,我将创建一个新列表,同时忽略//之后的字符,然后进行检查。使用set查找交点

import re
test_list = ['blah', 'foo', 'bar', 'jay/day']
set(('unknown', 'bar', 'foo', 'jay', 'anonymous', 'ja')).intersection(set([re.sub("/[\w]*","",i) for i in test_list]))

答案 3 :(得分:0)

使用正则表达式:

import re
l = ['blah', 'foo', 'bar', 'jay/day']

def match(name, l):
    for each in l:
        if re.match("^{}(\/|$)".format(name), each):
            return True # each if you want the string
    return False

结果:

match('ja', l) # False

match('jay', l) # True

match('foo', l) # True

使用元组:

tupl = ('unknown', 'bar', 'foo', 'jay', 'anonymous', 'ja')

res = [match(x, l) for x in tupl]

res:

[False, True, True, True, False, False]