对格式化字符串进行唯

时间:2014-01-22 17:44:49

标签: python c++ bash

这是我的第一篇文章。我正在开始对像时尚这样的URL格式化的字符串集合进行某种研究。假设我有一个包含以下字符串的文件:

A / B / C / d

对我来说这个字符串有4个组件。进入文件的字符串有不同的长度。我正在寻找一种有效的方法,也许是在BASH中,以获得每个字段的唯一字符串数量。

我真的很感激任何帮助或提示!

谢谢!

MIC

3 个答案:

答案 0 :(得分:2)

假设字符串总是由/分隔,以下是我在Python中的方法

start1 = "A/B/C/D"
start2 = "B/D/E/A/B"
start3 = "D/A/A/B/D/C"
start4 = "C"

startList = [start1, start2, start3, start4]
print "startList: ", startList
fields = []

for start in startList:
    for field in start.split('/'):
        fields.append(field)

print "fields: ", fields

countDict = dict.fromkeys(fields)
print "countDict 1: ", countDict

for entry in countDict.keys():
    countDict[entry] = fields.count(entry)

print "countDict 2: ", countDict

以下是print语句输出的内容:

startList: ['A/B/C/D', 'B/D/E/A/B', 'D/A/A/B/D/C', 'C']
fields: ['A', 'B', 'C', 'D', 'B', 'D', 'E', 'A', 'B', 'D', 'A', 'A', 'B', 'D', 'C', 'C']
countDict 1: {'A': None, 'C': None, 'B': None, 'E': None, 'D': None}
countDict 2: {'A': 4, 'C': 3, 'B': 4, 'E': 1, 'D': 4}

但是,如果起始字符串是巨型(数百万条目)并且速度非常重要,那么Python可能不是您的最佳选择。它易于学习,而且非常易读(以及我最喜欢的语言),但它的速度不如C等编译语言快。话虽如此,它对于绝大多数应用来说足够快

关于这种特殊方法的说明。有很多“更有趣”的方法来计算列表中的条目。许多更快,更“pythonic”,但这应该足以满足您的目的。如果您想查看这些方法,只需在网站上快速搜索即可。如果此方法中的任何内容不清楚,请告诉我,希望这有帮助!


如果你想要的是每个字符串中唯一条目的数量,那么这就是你要找的:

start1 = "A/B/C/D"
start2 = "B/D/E/A/B"
start3 = "D/A/A/B/D/C"
start4 = "C"

startList = [start1, start2, start3, start4]
print "startList: ", startList

countDict = dict.fromkeys(startList)
print "countDict 1: ", countDict

for start in startList:
    countDict[start] = len(set(start.split('/')))

print "countDict 2: ", countDict

以下是print语句输出的内容:

startList:  ['A/B/C/D', 'B/D/E/A/B', 'D/A/A/B/D/C', 'C']
countDict 1:  {'B/D/E/A/B': None, 'A/B/C/D': None, 'C': None, 'D/A/A/B/D/C': None}
countDict 2:  {'B/D/E/A/B': 4, 'A/B/C/D': 4, 'C': 1, 'D/A/A/B/D/C': 4}

答案 1 :(得分:0)

如果你关注个别部分:

for n in 1 2 3 4 5 6 7
do
    echo "for field # $n, unique values:"
    cut -d / -f $n collection-of-strings | sort | uniq -c
done

如果您正在查看URI类型的前缀:

for n in 1 2 3 4 5 6 7
do
    echo "for fields # 1…$n, unique prefices:"
    cut -d / -f 1-$n collection-of-strings | sort | uniq -c
done

这假设您的字段数不超过7个,如果字符串较长,则相应地调整for循环。

答案 2 :(得分:0)

给定“URL”位,假设您的意思是计算唯一组件而不是每个组件中的字数。然后我可能不会因为简单而使用bash,但如果我不得不做类似

的事情
  • 检查输入是否包含/

    [[ $input == *"/"* ]]
    
  • 检查输入是否包含空格字符

    [[ $input != *[[:space:]]* ]]
    
  • 将内部字段分隔符(IFS)设置为/

    IFS="/" #Note you are doing this in a shell script and not directly in a shell
    
  • 从输入中创建一个数组。

    arr=($input)
    
  • 使数组唯一。有关最简单的答案,请参阅https://stackoverflow.com/a/17758600/3076724

  • 然后打印组件数/每个

    做一些事情
    echo "Number of components in $input = ${#arr[@]}"
    for i in "${arr[@]}"; do
      #Do something with each component "$i"
    done
    

这应该让你开始,你可以轻松地将它们连接在一起,制作一个有效的shell脚本。