是否可以在python和其他语言中进行LC,但只能使用BASH结构?
我希望能做什么,例如:
function ignoreSpecialFiles()
{
for options in "-L" "-e" "-b" "-c" "-p" "-S" "! -r" "! -w"; do
if [[ $options "$1" -o $options "$2" ]];then
return $IGNORED
fi
done
}
而不是使用这样的代码:
if [[ -L "$1" -o -e "$1" -o -b "$1" -o -c "$1" -o -p "$1" -o -S "$1" -o\
! -r "$1" -o ! -w "$1" ]]
你知道有关模拟LC的任何配方吗?
更具特色的LC示例:
M = [x for x in S if x % 2 == 0] #is python
在bash中做同样事情的最pythonic方式是什么?
for x in S; do if x % 2 == 0;then (HERE MY HEAD EXPLODES) fi done
答案 0 :(得分:12)
如果你眯着眼睛,命令替换中的循环看起来像列表理解。你的第二个例子可以写成:
M=$(for x in $S; do if [ $(( x % 2 )) == 0 ]; then echo $x; fi done)
答案 1 :(得分:5)
这是一种半通用格式,用于在bash中使用数组执行相当于LC的操作:
outarray=()
for x in "${inarray[@]}"; do
if SOMECONDITION; then
outarray+=(SOMEFUNCTIONOFx)
fi
done
以下是此格式的第二个示例:
s=({1..10})
echo "${s[@]}"
# Prints: 1 2 3 4 5 6 7 8 9 10
m=()
for x in "${s[@]}"; do
if (( x % 2 == 0 )); then
m+=($x)
fi
done
echo "${m[@]}"
# Prints: 2 4 6 8 10
这是另一个例子,具有不那么重要的功能"但没有条件:
paths=("/path/to/file 1" "/path/somewhere/else" "/this/that/the other" "/here/there/everywhere")
filenames=()
for x in "${paths[@]}"; do
filenames+=( "$(basename "$x")" )
done
printf "'%s' " "${filenames[@]}"
# Prints: 'file 1' 'else' 'the other' 'everywhere'
答案 2 :(得分:1)
您所描述的内容看起来不像列表推导...您可以使用单个括号而不是双括号来执行您想要的操作(使用变量来表示您要执行的测试)。举个例子:
function ignoreSpecialFiles()
{
for options in "-L" "-e" "-b" "-c" "-p" "-S" "! -r" "! -w"; do
if [ $options "$1" -o $options "$2" ]
then
return $IGNORED
fi
done
}