我在解决解决此问题的逻辑时遇到问题。我有一个看起来像这种格式的列表:
['blah', 'foo', 'bar', 'jay/day']
没有'/'的任何东西都是正常名称。任何带有'/'字符的内容都是名称+附加字符串。我想要做的是遍历一组元组,并检查元组的第一个元素是否与列表中的任何名称匹配。但是,我也希望名称“ jay”与“ jay / day”匹配,但我不希望部分匹配(即,不希望“ ja”与“ jay”部分匹配)。
基本上,我想要一个名称的完全匹配,而忽略单个条目中“ /”后的任何内容。
在弄清其逻辑方面的任何帮助将不胜感激。
答案 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]