mirror of https://github.com/apache/cassandra
80 lines
2.5 KiB
Python
80 lines
2.5 KiB
Python
# Licensed to the Apache Software Foundation (ASF) under one
|
|
# or more contributor license agreements. See the NOTICE file
|
|
# distributed with this work for additional information
|
|
# regarding copyright ownership. The ASF licenses this file
|
|
# to you under the Apache License, Version 2.0 (the
|
|
# "License"); you may not use this file except in compliance
|
|
# with the License. You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
from itertools import izip
|
|
|
|
def split_list(items, pred):
|
|
"""
|
|
Split up a list (or other iterable) on the elements which satisfy the
|
|
given predicate 'pred'. Elements for which 'pred' returns true start a new
|
|
sublist for subsequent elements, which will accumulate in the new sublist
|
|
until the next satisfying element.
|
|
|
|
>>> split_list([0, 1, 2, 5, 99, 8], lambda n: (n % 2) == 0)
|
|
[[0], [1, 2], [5, 99, 8], []]
|
|
"""
|
|
|
|
thisresult = []
|
|
results = [thisresult]
|
|
for i in items:
|
|
thisresult.append(i)
|
|
if pred(i):
|
|
thisresult = []
|
|
results.append(thisresult)
|
|
return results
|
|
|
|
def find_common_prefix(strs):
|
|
"""
|
|
Given a list (iterable) of strings, return the longest common prefix.
|
|
|
|
>>> find_common_prefix(['abracadabra', 'abracadero', 'abranch'])
|
|
'abra'
|
|
>>> find_common_prefix(['abracadabra', 'abracadero', 'mt. fuji'])
|
|
''
|
|
"""
|
|
|
|
common = []
|
|
for cgroup in izip(*strs):
|
|
if all(x == cgroup[0] for x in cgroup[1:]):
|
|
common.append(cgroup[0])
|
|
else:
|
|
break
|
|
return ''.join(common)
|
|
|
|
def list_bifilter(pred, iterable):
|
|
"""
|
|
Filter an iterable into two output lists: the first containing all
|
|
elements of the iterable for which 'pred' returns true, and the second
|
|
containing all others. Order of the elements is otherwise retained.
|
|
|
|
>>> list_bifilter(lambda x: isinstance(x, int), (4, 'bingo', 1.2, 6, True))
|
|
([4, 6], ['bingo', 1.2, True])
|
|
"""
|
|
|
|
yes_s = []
|
|
no_s = []
|
|
for i in iterable:
|
|
(yes_s if pred(i) else no_s).append(i)
|
|
return yes_s, no_s
|
|
|
|
def identity(x):
|
|
return x
|
|
|
|
def trim_if_present(s, prefix):
|
|
if s.startswith(prefix):
|
|
return s[len(prefix):]
|
|
return s
|