如何从自定义元素创建单词列表?

如何从自定义元素创建单词列表?

我想从自定义元素创建文本文件中的单词列表:

element1:
word1
word2
word3

element2:
word4
word5

element3:
word6
word7

我希望每个元素都由元素 1、2、3 中的单词组合而成,例如:

word1word4word6
word1word5word6
word1word4word7
word1word5word7

依此类推,直到我得到列表中所有元素 1、2、3 的所有单词组合。如何在 shell 脚本或 python 脚本中做到这一点?我正在使用Linux。

答案1

这里听起来更像是一个纯粹的编程问题,与 Linux 或 Unix 无关,但这里有一个(未经测试的)代码:

#!/bin/bash
element1=( "word1" "word2" "word3" )
element2=( "word4" "word5" )
element3=( "word6" "word7" )
for i in "${element1[@]}"; do
  for j in "${element2[@]}"; do
    for k in "${element3[@]}"; do
      printf "%s%s%s\n" "$i" "$j" "$k"
    done
  done
done

答案2

使用 purePythonslices:

element1 = ( 'word1', 'word2', 'word3' )
element2 = ( 'word4', 'word5' )
element3 = ( 'word6', 'word7' )

for el1 in element1:
    for el2 in element2:
        for el3 in element3:
            print(el1 + el2 + el3)

使用 purebasharrays:

#!/bin/bash

element1=( 'word1' 'word2' 'word3' )
element2=( 'word4' 'word5' )
element3=( 'word6' 'word7' )

for el1 in "${element1[@]}"; do
    for el2 in "${element2[@]}"; do
        for el3 in "${element3[@]}"; do
            echo "$el1$el2$el3"
        done
    done
done

作为POSIXshell,利用 shell 的分词strings 上:

#!/bin/sh

element1="word1 word2 word3"
element2="word4 word5"
element3="word6 word7"
for el1 in $element1; do
    for el2 in $element2; do
        for el3 in $element3; do
            echo "$el1$el2$el3"
        done
    done
done

输出

word1word4word6
word1word4word7
word1word5word6
word1word5word7
word2word4word6
word2word4word7
word2word5word6
word2word5word7
word3word4word6
word3word4word7
word3word5word6
word3word5word7

答案3

zsh

element1=(
  word1
  word2
  word3
)
element2=(word4 word5)
element3=(word6 word7)

combinations=( $^element1$^element2$^element3 )

您可以使用它打印在一列上

print -rC1 -- $combinations

或者

printf %s $^combinations$'\n'

$^element1$^element2$^element3$element1$element2$element3如果您预先设置rcexpandparam选项 ( ),则可以简化为。set -o rcexpandparam

fish与默认情况下以相同样式的方式扩展数组相同rc

set element1 word1 word2 word3
set element2 wort4 word5
set element3 word6 word7
set combinations $element1$element2$element3
echo -ns -- $combinations\n

¹ 在 中rc,数组并不完全像那样扩展。a=(a b); echo x$a输出xa xb,但echo $a$a输出aa bbaa ab ba bb而不是 1 以外的不同大小的数组,你会得到一个错误,所以你不能在这里使用它。

答案4

使用(以前称为 Perl_6)

~$ raku -e 'my %h = slurp.split("\n\n", :skip-empty)    \
                    .map( *.split("\n", :skip-empty))   \
                    .map: {.[0] => .[1..*]};            \
            .say for [X] %h.map: *.value;'   file

此解决方案对于适合内存的文件非常有用,因为它slurp是一次性全部包含换行符等的文件。 ing之后slurp,文本将分成连续两个换行符split的段落。\n\n处理由两个分隔的“段落”或者更多连续的换行符,使用.split(/ \n ** 2..* /, :skip-empty).

一旦适当地分割成段落,每个段落就会再次分割成单个\n换行符以获得键/值结构,该结构存储在%h哈希中。第一行成为键 (index .[0]),而其余行成为值 (index .[1..*])。

最后,Raku 有一个X叉积中缀运算符,当给定 LHS 和 RHS 值列表时,它返回元素的组合。许多(全部?)中缀运算符可以转换为归约元运算符只需用方括号将它们括起来并将它们放在列表的开头即可。因此[X] %h.map: *.value;创建一个按键组织的哈希列表values,为其生成并输出组合叉积。

输入示例:

element1:
word1
word2
word3

element2:
word4
word5

element3:
word6
word7

示例输出:

(word1 word6 word4)
(word1 word6 word5)
(word1 word7 word4)
(word1 word7 word5)
(word2 word6 word4)
(word2 word6 word5)
(word2 word7 word4)
(word2 word7 word5)
(word3 word6 word4)
(word3 word6 word5)
(word3 word7 word4)
(word3 word7 word5)

由于 Raku 中的哈希值是随机的,因此每行您将获得必需的 3 个“单词”,但这些单词将按随机顺序排列。另外(至少与其他答案不同),这个 Raku 答案可以容忍重复的“单词”。

注意:要生成OP所需的确切输出,请将最后一行更改为join不带空格和out put

.join.put for [X] %h.map: *.value;

或者,更简单(使用~波形符串联):

.put for [X~] %h.map: *.value;

https://docs.raku.org/language/operators#Reduction_metaoperators
https://docs.raku.org/routine/X
https://raku.org

相关内容