我有两个包含'位图的字符串'工作日:例如,1------
仅在星期一,--3-5--
是星期三和星期五,你明白了。
我希望将它们与逻辑OR的等价物合并在一起,以便例如。 1------
|| --3-5--
= 1-3-5--
。最恐怖的方式是什么?我目前正在做这件事,但感觉不是特别优雅:
week1, week2, merged = '1------', '--3-5--', ''
for i in range(0, len(week1)):
merged += week1[i] if week1[i] != '-' else week2[i]
print merged
请注意,我使用的是Python 2.7,因此没有可变字符串,并且可以安全地假设输入字符串始终格式正确(=始终使用-
表示false和{{ 1}}在正确的位置为真)。
答案 0 :(得分:5)
使用zip
,generator expression和conditional expression:
>>> ''.join(b if a == '-' else a for a, b in zip('1------', '--3-5--'))
'1-3-5--'
答案 1 :(得分:3)
您可以使用内置map
,max
和zip
:
>>> week1, week2 = '1------', '--3-5--'
>>> ''.join(map(max, zip(week1, week2)))
'1-3-5--'
这是因为:
zip
返回每个字符串中第n个字符的元组[('1', '-'), ('-'. '-'), ... ]
max
时, -
才会从元组返回-
。这是因为-
的排序低于数字字符,例如max('1', '-') == '1'
。
map
将max
应用于压缩列表中的每个元组,生成最大字符列表。
''.join
使用空字符串将使用map
生成的最大字符列表链接在一起。
如果您有超过两周的字符串,则此表达式也有效:
>>> week3 = '------7'
>>> ''.join(map(max, zip(week1, week2, week3)))
'1-3-5-7'
答案 2 :(得分:3)
您可以将其概括为适用于任意数量的周的函数,例如:
week1, week2, week3 = '1------', '--3-5--', '---4--6-'
def bitor_weeks(*args):
days = set().union(*args).difference('-')
return ''.join(ch if ch in days else '-' for ch in '1234567')
print bitor_weeks(week1, week2, week3)
或者选择整个hog并在其上启用所有按位操作,例如:
class WeekSet(set):
def __init__(self, *args):
days = set().union(*args).difference('-')
if days.difference('1234567-'):
raise ValueError('inputs must be 1-7 or -')
set.__init__(self, days)
def __repr__(self):
return ''.join(ch if ch in self else '-' for ch in '1234567')
week1, week2, week3 = '1------', '--3-5--', '-2-4--7'
t1 = WeekSet(week1, week2)
# 1-3-5--
print WeekSet('456') & t1
# ----5--
答案 3 :(得分:0)
这有点重,但你可能有超过2个“周”字符串
''.join(filter(lambda l: l!='-', lst)[0] if set(lst) != set(['-']) else '-'
for lst in zip(week1, week2))